sql - 如何让多个 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
解决方案
修复你的GROUP BY
:
GROUP BY sp.BusinessEntityID, pp.LastName;
删除soh.OrderDate
,因为您不希望每个日期都有单独的行。
请注意,这SELECT DISTINCT
几乎不适合GROUP BY
,当然也不适合此查询。
推荐阅读
- algorithm - PPMD 解压算法是如何工作的?
- javascript - history.pushState 不会更新移动 Chrome 上“share ...”按钮的 url
- javascript - AngularJS输入字段复选框ng-click不触发方法
- python - 当没有任何行是唯一的时,使用 pandas 将一列分组为一个
- ios - 以编程方式快速自动布局
- android - 如何在xml中使用gradle占位符applicationId来制作唯一的contentProvider权限
- mysql - 如何获取用户 id 已经下过超过 1 个订单的订单记录
- javascript - 我想在网页中添加一些 Javascript 代码,该代码可以记录用户与网页交互时网页发出的所有网络请求和响应
- django - TemplateView 在 django get_absolute_url 中不起作用
- javascript - 浮动菜单项不起作用