我创建了如下 View ,看起来像这张表。
Create Table #Temptable(
[Week number] int,
[Did Not meet minimum] int,
[Met minimum] int,
[exceeded minimum] int);
insert into #Temptable([Week number],[Did Not meet minimum],[Met minimum],[exceeded minimum])
values
(3,161,4,18),
(4,165,1,24),
(5,166,0,10)
我希望输出为三行,以便我可以按周创建趋势报告。我可以填充临时表以获得所需的结果,但我想看看是否有更好的解决方案。
Label, week3, week4, week5
Did not meet minimum, 161, 165, 166
Met minimum, 4, 1, 0
Exceeded minimum, 18, 24, 10
如果无法从这个数据集中做到这一点,我还有创建 View 的源行项目详细信息。该数据集看起来像这样
techname,machinename,installdate,weeknumber
我制作了 3 个按技术名称和周数聚合的标量函数,以便我可以获得每周的未达到、达到和超过安装计数。
提前谢谢你。
在收到 StuartLC 的回复后,我开始制作我自己的动态版本,我已经很接近了,但是当我发布回复时,另一个好心的人发布了一个工作版本。为了每个人的利益,这里是我放在一起的示例代码,但是它不起作用。如果我复制错误文本并只选择输出的查询,它会正常工作。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.[week number])
FROM SummarisedWeeklysums c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT Criteria, '+ @Cols +' FROM
(
SELECT
*
FROM
SummarisedWeeklysums
UNPIVOT
(
CriteriaCount
for Criteria in ([Did Not meet minimum],[Met minimum],[exceeded minimum])
) unpvt
) X
PIVOT
(
SUM(CriteriaCount)
for [Week Number] IN ('+@Cols+')
)pvt'
execute @query
最佳答案
这与我的 answer here 非常相似- 基本上你正在寻找一个完整的转置。这可以通过一个 unpivot,然后是一个 pivot 来完成:
SELECT Criteria, [3] as Week3, [4] AS Week4, [5] AS Week5
FROM
(
SELECT
*
FROM
#Temptable
UNPIVOT
(
CriteriaCount
for Criteria in ([Did Not meet minimum],[Met minimum],[exceeded minimum])
) unpvt
) X
PIVOT
(
SUM(CriteriaCount)
for [Week Number] IN ([3],[4],[5])
)pvt;
此外,如果您需要在一系列未知周(或标准,我猜)中执行此操作,您可以查看 answer here它使用动态 sql 构建列并执行数据透视表。
关于sql - 需要 SQL 数据透视帮助,因为我没有聚合列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21581124/