使用SQL Server 2008 R2在透视表查询中聚合函数

使用SQL Server 2008 R2在透视表查询中聚合函数,sql,sql-server,sql-server-2008,pivot-table,Sql,Sql Server,Sql Server 2008,Pivot Table,我有一个如下表所示的详细信息: 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,'

我有一个如下表所示的详细信息:

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
注意:请注意第1行和第3行的
。在
AvailableIn
中,第1行的列值为5,其中列的可用值仅为4,即
c、d、L1、x
其余均为零。还有第3行,其中
AvailableIn
为2,其中列的可用值仅为1,即
y
。我想我被困在
透视查询中的
聚合函数中了


SQL Fiddle->

如果
colb
大于1(您所有的字母都是),您需要一个不同的
colb
列表(在父查询中)

这是我唯一的改变:

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

你确定有问题吗

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

您已经拥有了所有的位,如果有一个Please check SQL Fiddle,这将是非常有帮助的。最近有一个类似的问题,但我看到它是different@Used_By_Already不!这是针对TotalGroup的问题。这是为已被使用的
提供的,是的,这是另一个。
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)