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)