2014-09-11 168 views
0

我在使用SQL Server 2008 R2的数据透视表查询中遇到了计数问题。使用SQL Server 2008 R2的数据透视表

我有一个表testrf

CREATE TABLE testrf 
(
    cola INTEGER, 
    colb VARCHAR(10) 
) 

对于一些数据:

INSERT INTO testrf VALUES(1,'x') 
INSERT INTO testrf VALUES(1,'x') 
INSERT INTO testrf VALUES(2,'x') 
INSERT INTO testrf VALUES(3,'y') 
INSERT INTO testrf VALUES(4,'y') 
INSERT INTO testrf VALUES(5,'c') 
INSERT INTO testrf VALUES(6,'c') 
INSERT INTO testrf VALUES(7,'c') 
INSERT INTO testrf VALUES(8,'d') 
INSERT INTO testrf VALUES(3,'y') 
INSERT INTO testrf VALUES(12,'M1') 
INSERT INTO testrf VALUES(13,'L1') 
INSERT INTO testrf VALUES(14,'C2') 

看起来像这样:

SELECT * FROM testrf; 

cola colb 
------------ 
    1  x 
    1  x 
    2  x 
    3  y 
    4  y 
    5  c 
    6  c 
    7  c 
    8  d 
    3  y 
12  M1 
13  L1 
14  C2 

我的透视表查询:

DECLARE @cols NVARCHAR(MAX) 
DECLARE @SQL NVARCHAR(MAX) 

SELECT @cols = STUFF ((SELECT DISTINCT '],[' + v.colb       
       FROM testrf AS v           
FOR XML PATH('')), 1, 2, '') + ']' 


SET @SQL = N'SELECT cola,'+ @cols +' 
    FROM      
    (SELECT v.cola,v.colb 
     FROM testrf AS v         
     GROUP BY v.cola,v.colb     
    ) p      
     PIVOT     
      (   
       count(colb)       
       FOR colb IN ('+ @cols + ')       
      ) AS pvt';  

EXEC(@SQL) 

获得结果:

cola c C2 d L1 M1 x y 
---------------------------------- 
1  0 0 0 0 0 1 0 
2  0 0 0 0 0 1 0 
3  0 0 0 0 0 0 1 
4  0 0 0 0 0 0 1 
5  1 0 0 0 0 0 0 
6  1 0 0 0 0 0 0 
7  1 0 0 0 0 0 0 
8  0 0 1 0 0 0 0 
12  0 0 0 0 1 0 0 
13  0 0 0 1 0 0 0 
14  0 1 0 0 0 0 0 

注意colb=x是中出现了2次,cola=1colb=y中出现了2次cola=3。在这里计算问题。

回答

1

您不需要在GROUP BY子句内的子查询中(P)

DECLARE @cols NVARCHAR(MAX) 
DECLARE @SQL NVARCHAR(MAX) 

SELECT @cols = STUFF ((SELECT DISTINCT ',' + QUOTENAME(v.colb) 
       FROM testrf AS v 
FOR XML PATH('')), 1, 1, '') 


SET @SQL = N'SELECT cola,'+ @cols +' 
    FROM 
    (SELECT v.cola,v.colb 
     FROM testrf AS v 
    ) p 
     PIVOT 
      (
       count(colb) 
       FOR colb IN ('+ @cols + ') 
      ) AS pvt' 

EXEC(@SQL) 
; 

我也使用QUOTENAME()

从您的样本数据提出了改变您的@cols这将产生以下结果:

| COLA | C | C2 | D | L1 | M1 | X | Y | 
|------|---|----|---|----|----|---|---| 
| 1 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 
| 2 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 
| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 
| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 
| 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 
| 6 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 
| 7 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 
| 8 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 
| 12 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 
| 13 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 
| 14 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 

See this at SQLfiddle

+0

非常感谢你 – Meem 2014-09-11 06:54:37

+0

很高兴。 – 2014-09-11 07:14:42