如何在PIVOT运算符中使用group by子句?
我尝试使用以下代码,但是我得到了空值,结果没有聚合。
select EmpName, CHN,HYD FROM location
PIVOT (Sum(salary) for EmpLoc in ([CHN], [HYD]))
AS
pivottable
我希望最终输出是这样的。
CHN HYD
kunder 400 200
shetty 150 150
或
CHN HYD Total
kunder 400 200 600
shetty 150 150 300
Total 550 350 900
答案 0 :(得分:1)
只需添加派生列Total=CHN+HYD
和子查询即可创建总行
Seq(虽然没有显示)会将Total行放在底部
Declare @YourTable table (EmpLoc varchar(25),EmpName varchar(25),Salary int)
Insert Into @YourTable values
('HYD','kunder',200)
,('HYD','shetty',150)
,('CHN','shetty',150)
,('CHN','kunder',200)
,('CHN','kunder',200)
Select EmpName, CHN,HYD,Total=CHN+HYD
From (
Select Seq=0,EmpLoc,EmpName,Salary From @YourTable
Union All
Select Seq=1,EmpLoc,'Total',Salary From @YourTable
) A
pivot (sum(Salary) for EmpLoc in ([CHN], [HYD])) P
返回
EmpName CHN HYD Total
kunder 400 200 600
shetty 150 150 300
Total 550 350 900
答案 1 :(得分:1)
Declare @YourTable table (EmpLoc varchar(25),EmpName varchar(25),Salary int)
Insert Into @YourTable values
('HYD','kunder',200)
,('HYD','shetty',150)
,('CHN','shetty',150)
,('CHN','kunder',200)
,('CHN','kunder',200)
;with cte as
(
SELECT * from
(
select * from @YourTable
) as y
pivot
(
sum(salary)
for EmpLoc in ([CHN], [HYD])
) as p
)
SELECT
EmpName,sum(CHN)CHN ,sum(HYD)HYD
FROM CTE
GROUP BY EmpName;
答案 2 :(得分:0)
使用您的示例中的代码来获得所需的结果我没有任何问题。我猜你的查询并不像你的例子那么简单,因此引入了其他未在此处显示的复杂情况。
您可能需要使用子查询和数据透视表,仅使用数据透视表所需的列,然后返回查询的其余部分,以使用pivot()
获取您要查找的结果。
使用条件聚合可能是一个更简单的解决方案:
select
empname
, CHN = sum(case when emploc = 'CHN' then salary else 0 end)
, HYD = sum(case when emploc = 'HYD' then salary else 0 end)
--, Total = sum(salary) /* Optional total */
from location
group by empname
rextester演示:http://rextester.com/LYRH81756
返回:
+---------+-----+-----+
| EmpName | CHN | HYD |
+---------+-----+-----+
| kunder | 400 | 200 |
| shetty | 150 | 150 |
+---------+-----+-----+