【问题标题】:Aggregate function within Pivot table query using SQL Server 2008 R2使用 SQL Server 2008 R2 的数据透视表查询中的聚合函数
【发布时间】:2014-09-13 06:36:27
【问题描述】:

我有一个如下所示的表格:

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')
INSERT INTO testrf VALUES(1,'c')
INSERT INTO testrf VALUES(1,'d')
INSERT INTO testrf VALUES(1,'L1')


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
1       c
1       d
12      M1
13      L1
14      C2
1       L1

现在我想显示我已为其编写查询的上述数据的数据透视表:

 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,TotalGroups,AvailableIn,'+ @cols +'
   FROM                     
   (SELECT  v.cola,v.colb,(select count(distinct colb) from testrf) TotalGroups,c.AvailableIn
       FROM testrf AS v  
       inner join
       (select cola,count(case when colb>=1 then 1 else 0 end) AS AvailableIn FROM testrf
       group by cola) c 
       on c.cola = v.cola                                                                                                  
    ) p                     
       PIVOT                
           (            
               count(colb)                        
               FOR colb IN ( '+ @cols + ' )                        
           ) AS pvt';      

    EXEC(@SQL)     

我会得到这个:

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

注意:请注意row number 1 and 3。在AvailableIn 中,第一行的列值为 5,其中列的可用值仅为 4,即 c,d,L1,x 其余均为零。还有第 3 行,其中AvailableIn 为 2,其中列的可用值仅为 1,即y。我认为我被困在pivot query 中的aggregate function 中。

SQL 小提琴-> http://sqlfiddle.com/#!3/d1acc/8

【问题讨论】:

  • 你已经掌握了所有的知识,如果有一个sqlfiddle.会很有帮助
  • 请检查 SQL Fiddle。
  • 最近有一个类似的问题,但我看不一样
  • @Used_By_Already,不!那是针对 TotalGroup 的问题。这是给AvailableIn的。
  • @Used_By_Already,是的,这是不同的。

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


【解决方案1】:

如果colb 大于 1(你所有的字母都是),而不是计算,你想要一个 colb 的不同列表(就像你在父查询中一样)

这是我所做的唯一更改:

(select cola,count(distinct colb) AS AvailableIn FROM testrf

Fiddle

【讨论】:

    【解决方案2】:

    你确定有问题吗?

    INSERT INTO testrf VALUES(1,'x');
    INSERT INTO testrf VALUES(1,'x');
    ...
    INSERT INTO testrf VALUES(1,'c');
    INSERT INTO testrf VALUES(1,'d');
    INSERT INTO testrf VALUES(1,'L1');
    
    That is 5 references to ColA = 1
    
    c    C2  d   L1  M1  x   y
    1    0   1   1   0   2   0  << adds to 5
    

    我会在您的查询中添加一些建议

    1. 使用 QUOTENAME() 而不是硬编码 [ ] 括号。
    2. ColB 是 Varchar,所以不要使用 WHEN ColB >=1,使用 COLB >= '1'
    3. COUNT() 为每个非空值加一,所以不要在计数中使用else 0

      DECLARE @cols NVARCHAR(MAX), @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,TotalGroups,AvailableIn,'+ @cols +'
         FROM                     
         (SELECT  v.cola,v.colb,(select count(distinct colb) from testrf) TotalGroups,c.AvailableIn
             FROM testrf AS v  
             inner join
             (select cola,count(case when colb>=''1'' then 1 end) AS AvailableIn FROM testrf
             group by cola) c 
             on c.cola = v.cola                                                                                                  
          ) p                     
             PIVOT                
                 (            
                     count(colb)                        
                     FOR colb IN ( '+ @cols + ' )                        
                 ) AS pvt'    
      
      EXEC(@SQL) 
      

    【讨论】:

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