我创建的视图如下所示。
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
如果从这个数据集中无法做到这一点,我还会创建视图的源行项目详细信息。该数据集看起来像这样
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
答案 0 :(得分:2)
这与我的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;
另外,如果你需要为一堆未知的周(或者我认为标准)做这件事,你可以查看使用动态sql来构建列并执行数据透视的answer here。 / p>
答案 1 :(得分:1)
这是基于StuartLC的回答和链接(信用给您),如果将来会增加额外的周数,则具有可扩展性:
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' +
QUOTENAME('Week'+cast([Week Number] as varchar))
FROM #Temptable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
select @query =
'SELECT *
FROM
(
SELECT
''Week''+cast([Week number] as varchar) as [Week number] , CriteriaCount , Criteria
FROM
#Temptable
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);
下面是相同的代码,结果移入临时表(由user3275636请求),然后显示:
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' +
QUOTENAME('Week'+cast([Week Number] as varchar))
FROM #Temptable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
select @query =
'select * into ##temp1 from (SELECT *
FROM
(
SELECT
''Week''+cast([Week number] as varchar) as [Week number] , CriteriaCount , Criteria
FROM
#Temptable
UNPIVOT
(
CriteriaCount
for Criteria in ([Did Not meet minimum],[Met minimum],[exceeded minimum])
) unpvt
) X
PIVOT
(
SUM(CriteriaCount)
for [Week Number] in (' + @cols + ')
)pvt ) as combi;';
execute(@query);
select * from ##temp1;