【问题标题】:Pivot table using SQL Server 2008 R2使用 SQL Server 2008 R2 的数据透视表
【发布时间】:2014-09-11 05:51:30
【问题描述】:

我在使用 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=1 和 colb=y 出现 2 次 cola=3。在这里遇到计数问题。

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql pivot


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多