报表的SQL查询
我正在编写一份汇总报告,到目前为止我已经掌握了数据,但我不确定如何从这里开始。我能通过SQL,但我的技能有限 我在临时表中有以下内容报表的SQL查询,sql,sql-server,sql-server-2008,tsql,pivot,Sql,Sql Server,Sql Server 2008,Tsql,Pivot,我正在编写一份汇总报告,到目前为止我已经掌握了数据,但我不确定如何从这里开始。我能通过SQL,但我的技能有限 我在临时表中有以下内容 ID Count Action 2 23 Installed 2 12 Uninstalled 2 36 Unchanged 3 12 Installed 3 25 Unchanged 4 35 Installed 4 25 Unchanged 我想把它转换成
ID Count Action
2 23 Installed
2 12 Uninstalled
2 36 Unchanged
3 12 Installed
3 25 Unchanged
4 35 Installed
4 25 Unchanged
我想把它转换成这种格式
ID Installed Uninstalled Unchanged
2 23 12 36
3 12 0 36
4 35 0 25
我不知道该去哪里,甚至不知道如何开始实现这一目标,也找不到任何东西为我指明正确的方向(我确信它就在某个地方)
任何帮助都是值得的它被称为支点
关于它的文档
语法是
SELECT <non-pivoted column>,
[first pivoted column] AS <column name>,
[second pivoted column] AS <column name>,
...
[last pivoted column] AS <column name>
FROM
(<SELECT query that produces the data>)
AS <alias for the source query>
PIVOT
(
<aggregation function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]
IN ( [first pivoted column], [second pivoted column],
... [last pivoted column])
) AS <alias for the pivot table>
<optional ORDER BY clause>;
SELECT,
[first pivoted column]作为,
[second pivoted column]作为,
...
[最后一个数据透视列]作为
从…起
()
作为
支点
(
()
对于
[]
在([第一个数据透视列],[第二个数据透视列],
…[最后一个数据透视列])
)作为
;
试试这个:
SELECT
ID,
MAX(CASE WHEN "Action" = 'Installed' THEN Count END) AS 'Installed',
MAX(CASE WHEN "Action" = 'Uninstalled ' THEN Count END) AS 'Uninstalled',
MAX(CASE WHEN "Action" = 'Unchanged' THEN Count END) AS 'Unchanged'
FROM Table
GROUP BY ID;
或者使用SQL ServerPIVOT
table操作符,如下所示:
SELECT *
FROM
(
SELECT * FROM table
)t
PIVOT
(
MAX("Count") FOR "Action" IN([Installed], [Uninstalled], [Unchanged])
) p
但是,对于数量未知的操作
s,您必须动态选择它们,如下所示:
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Action)
from Table1
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
SET @query = 'SELECT ID, ' + @cols + ' from
(
SELECT * FROM Table1
) x
PIVOT
(
MAX(count)
FOR action IN (' + @cols + ')
) p ';
EXECUTE(@query);
枢轴很好,但有时非常缓慢。不带一个试试看
SELECT ID
, SUM(CASE WHEN [Action] = 'Installed' THEN [Count] ELSE 0 END) AS Installed
, SUM(CASE WHEN [Action] = 'Uninstalled' THEN [Count] ELSE 0 END) AS Uninstalled
, SUM(CASE WHEN [Action] = 'Unchanged' THEN [Count] ELSE 0 END) AS Unchanged
FROM <table>
GROUP BY ID
选择ID
,SUM(当[Action]=“Installed”时的情况,然后是[Count]否则0结束)已安装
,求和(当[Action]=“Uninstalled”然后[Count]否则0结束时的情况)为已卸载
,求和(当[Action]=“Unchanged”然后[Count]否则0结束时的情况)为未更改
从…起
按ID分组
Ha,你赢了我几秒钟!我没想到会有人帮我写代码:)太好了,你的第一个例子非常好用。谢谢@这是我的荣幸。随时欢迎你。请参阅我的编辑,以防您希望动态编写此查询,而不是写入值[已安装],[已卸载],[未更改]
硬编码。GROUP BY的工作速度比pivot快得多的原因是它在表的一次传递中执行整个操作,而不是有效的交叉联接。是否希望每个id
都有一个和
?我不知道从哪里可以得到id=3
和未更改的值?另外,您是否有固定数量的操作
值?如果由于id 3或4没有更改,因此没有更改,则需要为0