2014-09-11 110 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