简体   繁体   English

使用SQL Server 2008 R2的数据透视表

[英]Pivot table using SQL Server 2008 R2

I am getting count issue in the pivot table query using the SQL Server 2008 R2. 我在使用SQL Server 2008 R2的数据透视表查询中遇到计数问题。

Example : 范例

I have a table testrf : 我有一个表testrf

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

With some data: 有一些数据:

 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')

Looks like this: 看起来像这样:

 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

My Pivot table query: 我的数据透视表查询:

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)   

Getting Result: 获得结果:

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

Note : colb=x is occurred 2 times for cola=1 and colb=y occurred 2 times for cola=3 . 注意colb=x对于cola=1发生了2次,而colb=y对于cola=3发生了2次。 Getting counting issue here. 在这里开始计数问题。

You don't require the GROUP BY clause within the inner subquery (p) 您不需要内部子查询(p)中的GROUP BY子句

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)
;

I have also proposed a change to your @cols by using QUOTENAME() 我还建议使用QUOTENAME()更改您的@cols

From your sample data this produces the following result: 根据您的样本数据,将产生以下结果:

| 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 在SQLfiddle上看到这个

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM