Sql server 如何在pivot中获得不同的计数?

Sql server 如何在pivot中获得不同的计数?,sql-server,pivot-table,unpivot,Sql Server,Pivot Table,Unpivot,我有下表: State LAB GROUP DATE CODE ID UP A I 1-Jan 1 345 UP R S 1-Feb 1 456 UP A S 1-Jan 2 567 DL R S 1-Feb 3 678 DL T S 1-Jan 1 789 DL A S 1-Jan 2 900 MN T S 1-Jan 3 1011 MN R

我有下表:

State   LAB GROUP   DATE    CODE    ID
UP  A   I   1-Jan   1   345
UP  R   S   1-Feb   1   456
UP  A   S   1-Jan   2   567
DL  R   S   1-Feb   3   678
DL  T   S   1-Jan   1   789
DL  A   S   1-Jan   2   900
MN  T   S   1-Jan   3   1011
MN  R   I   1-Feb   1   1122
MN  S   I   1-Feb   2   1233
我需要以下类型的透视表:

STATE   A   R   T   TOTAL
UP  2   1   0   3
DL  1   1   1   3
MN  0   1   1   2
每个州每个实验室的ID的不同计数

然后,我需要为以下列筛选数据透视表:

团体 日期 代码

因此,第一个表将具有上面的透视表,只计算那些具有GROUP=S的记录 第二个表将具有上面的透视表,只计算代码为1的记录

等等,我想提出多个条件。并逐个生成多个表并导出它们

如果这在SQL中是可能的,请让我知道!我排除了excel vba,因为表的大小源表将有大约800000条记录。

请尝试以下操作:-

Select [State],[A],[R],[T],Total = [A] + [R]+ [T]
from 
(
    Select [State],
           [A] = Sum(Case when LAB='A' then 1 else 0 END) ,
           [R] = Sum(Case when LAB='R' then 1 else 0 END) ,
           [T] = Sum(Case when LAB='T' then 1 else 0 END) 
   from YourTable
   group by [State]
)a
您的样品台

SELECT * INTO #TEMP FROM
(               
    SELECT 'UP' [State],'A' LAB,'I' [GROUP],'1-Jan' [DATE],1 CODE,345 ID
    UNION ALL
    SELECT 'UP','R','S','1-Feb',1,456
    UNION ALL
    SELECT 'UP','A','S','1-Jan',2,567
    UNION ALL
    SELECT 'DL','R','S','1-Feb',3,678
    UNION ALL
    SELECT 'DL','T','S','1-Jan',1,789
    UNION ALL
    SELECT 'DL','A','S','1-Jan',2,900
    UNION ALL
    SELECT 'MN','T','S','1-Jan',3,1011
    UNION ALL
    SELECT 'MN','R','I','1-Feb',1,1122
    UNION ALL
    SELECT 'MN','S','I','1-Feb',2,1233  
)TAB
现在,您需要获得每个状态的不同计数,并获得总和作为结果,以显示总数 在旋转的结果中

SELECT DISTINCT [State],LAB,SUM(CNT) CNT 
INTO #NEWTABLE
FROM 
(
    SELECT DISTINCT 
    [State],LAB,
    CASE WHEN [State] IS NULL THEN NULL ELSE COUNT([State]) OVER(PARTITION BY [State],LAB) END CNT  
    FROM #TEMP
)TAB
GROUP BY [State],LAB
WITH ROLLUP
现在我们需要得到pivot@cols和列,以在中标识null并将其替换为零pivot@NullToZeroCols

DECLARE @cols NVARCHAR (MAX)
DECLARE @NullToZeroCols NVARCHAR (MAX)


SET @cols = SUBSTRING((SELECT DISTINCT ',['+LAB+']' FROM #NEWTABLE GROUP BY LAB  FOR XML PATH('')),2,8000)

SET @NullToZeroCols = SUBSTRING((SELECT DISTINCT ',ISNULL(['+LAB+'],0) AS ['+LAB+']' 
FROM #NEWTABLE GROUP BY LAB FOR XML PATH('')),2,8000)
将数据透视查询与新表联接,以获取每个状态的总计

DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT P.State,' + @NullToZeroCols + ',T2.CNT TOTAL FROM 
             (
                 SELECT DISTINCT [State],LAB,CNT FROM #NEWTABLE
             ) x
             PIVOT 
             (
                 SUM(CNT)
                 FOR [LAB] IN (' + @cols + ')
            ) p
            JOIN #NEWTABLE T2 ON P.[STATE]=T2.[STATE] 
            WHERE P.State IS NOT NULL AND T2.LAB IS NULL AND T2.[STATE] IS NOT NULL;'

EXEC SP_EXECUTESQL @query
这是你的结果

这是SQLFiddle如果在加载页面时显示任何错误,只需单击RUNSQL即可

现在,如果您想得到您所说的每个州每个实验室ID的不同计数的结果,只需更改

OVER(PARTITION BY [State],LAB)

执行pivot查询后,将显示以下结果


另一个使用PIVOT的解决方案:

用PivotInUse作为 选择状态、实验室、计数*作为cnt 从你的桌子上 按州分组,实验室 选择状态 ,合并[A],0作为一个 ,合并[R],0为R ,合并[T],0为T ,聚结[A],0+聚结[R],0+聚结[T],0作为总数 来自PivotInUse [A]、[R]、[T]中实验室的数据透视消耗量为p;
OVER(PARTITION BY [State],LAB)
OVER(PARTITION BY [State],LAB,Id)