具有多个嵌套查询T-SQL的GROUP BY

问题描述 投票:0回答:1

我正在尝试根据不同的条件执行多次计数,并按年份和月份对结果进行分组。

我有一个投诉表,我想统计:

  • 每年和每月收到的投诉总数
  • 每年和每月收到被取消的投诉
  • 每年和每月收到已解决的投诉等...

我使用多个嵌套的选择语句来对每个场景进行计数,并且它们独立工作。 但是,当我运行整个查询时,出现错误: 列“db.CustomerComplaints.id_Contact”在选择列表中无效,因为它未包含在聚合函数或 GROUP BY 子句中。

请参阅下面我的代码:

SELECT 
YEAR(ReceivedDate) AS 'Year',
FORMAT(ReceivedDate, 'MMMM') AS 'Month name',
COUNT(*) AS 'Received Complaints'
,
    (SELECT COUNT(*)
        FROM db.CustomerComplaints t
        WHERE t.status = 'Resolved'
        AND t.id_Contact = cc.id_Contact
    ) AS 'Resolved Complaints'
,
    (
        SELECT COUNT(*)
        FROM db.CustomerComplaints t
        WHERE t.status = 'New'
        AND t.id_Contact = cc.id_Contact
    ) AS 'New Complaints'
FROM hug2.CustomerComplaints cc
LEFT JOIN hug2.ReferralUpdates r
ON cc.id_Contact = r.Reference
WHERE r.ReferenceCode = 'Project1'
GROUP BY YEAR(ReceivedDate), FORMAT(ReceivedDate, 'MMMM')

我想要得到的结果是:

年份 收到投诉 已解决的投诉 新投诉
2023 三月 5 5 0
2023 四月 15 10 5
2024 三月 7 4 3

我希望我的问题有意义。

sql t-sql group-by azure-synapse-analytics
1个回答
0
投票

您可以尝试将子查询移至连接,如下所示:

SELECT 
    YEAR(ReceivedDate) AS 'Year',
    FORMAT(ReceivedDate, 'MMMM') AS 'Month name',
    COUNT(*) AS 'Received Complaints',
    rc.[Resolved Complaints],
    nc.[New Complaints]
FROM hug2.CustomerComplaints cc
    LEFT JOIN hug2.ReferralUpdates r ON cc.id_Contact = r.Reference
    left join
    (
        SELECT t.id_Contact, 
            COUNT(*) AS 'Resolved Complaints'
        FROM db.CustomerComplaints t
        WHERE t.status = 'Resolved'
    ) rc on rc.id_Contact = cc.id_Contact 
    left join 
    (
        SELECT t.id_Contact,
            COUNT(*) as 'New Complaints'
        FROM db.CustomerComplaints t
        WHERE t.status = 'New'
    ) nc on nc.id_Contact = cc.id_Contact
WHERE r.ReferenceCode = 'Project1'
GROUP BY 
    YEAR(ReceivedDate), 
    FORMAT(ReceivedDate, 'MMMM'),
    rc.[Resolved Complaints],
    nc.[New Complaints]
© www.soinside.com 2019 - 2024. All rights reserved.