2017-04-10 117 views
2

如何使用PIVOT运算符中的group by子句?Group by by PIVOT运算符

enter image description here

我试着用下面的代码,但我得到空值,结果都没有得到聚集。

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

你可以把你的支点在CTE和写语句GROUP BY上一个 – DenStudent

回答

1

只需添加派生列Total=CHN+HYD和一个子查询来创建总行数

的SEQ(尽管不显示)将投入总计行底部

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 
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 | 
+---------+-----+-----+ 
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; 
+1

row_number()是什么? – SqlZim

+0

对不起@SqlZim我删除它 – Chanukya

+0

随着row_number()也工作正常。 – santhosha