首页 > 解决方案 > 如何让多个 CASE 结果出现在 SQL Server 的同一行中

问题描述

我正在寻找一些关于我试图通过AdventureWorks2012使用 SQL Server 2014 实现的结果的帮助。

我试图达到的结果是每个销售人员在财政季度的总销售额。

我希望结果是每行有 1 个销售人员,其中 Q1、Q2、Q3、Q4 的总销售额(2012 年 7 月 - 2013 年 6 月)

SELECT DISTINCT 
    pp.LastName, sp.BusinessEntityID AS SalesPersonID,
    SUM(CASE 
           WHEN MONTH(soh.OrderDate) BETWEEN 7 AND 9 THEN soh.SubTotal END) AS Q1,
    SUM(CASE
           WHEN MONTH(soh.OrderDate) BETWEEN 10 AND 12 THEN soh.SubTotal END) AS Q2,
    SUM(CASE
           WHEN MONTH(soh.OrderDate) BETWEEN 1 AND 3 THEN soh.SubTotal END) AS Q3,
    SUM(CASE
           WHEN MONTH(soh.OrderDate) BETWEEN 4 AND 6 THEN soh.SubTotal END) AS Q4
FROM 
    Sales.SalesPerson sp
INNER JOIN
    Person.Person pp ON sp.BusinessEntityID = pp.BusinessEntityID
INNER JOIN
    Sales.SalesOrderHeader soh ON sp.BusinessEntityID = soh.SalesPersonID
WHERE 
    soh.OrderDate BETWEEN '2012-07-01' AND '2013-06-30'
GROUP BY 
    sp.BusinessEntityID, pp.LastName, soh.OrderDate; 

当前结果示例;

LastName     SalesPersonID     Q1     Q2     Q3     Q4
---------------------------------------------------------
Alberts          283        2443.24   NULL  NULL   NULL
Alberts          283          NULL   NULL  NULL   32344.342
Alberts          283          NULL   34234  NULL   NULL

我的期望;

LastName     SalesPersonID     Q1     Q2     Q3     Q4
-----------------------------------------------------------
Alberts          283         2443.24   2324  1142   686858
Jones            287         2443.24   2324  1142   686858
Jimenez          299         2443.24   2324  1142   686858

标签: sqlsql-servertsqladventureworks

解决方案


修复你的GROUP BY

GROUP BY sp.BusinessEntityID, pp.LastName; 

删除soh.OrderDate,因为您不希望每个日期都有单独的行。

请注意,这SELECT DISTINCT几乎不适合GROUP BY,当然也不适合此查询。


推荐阅读