需要SQL数据透视帮助,因为我没有聚合列

时间:2014-02-05 15:18:28

标签: sql sql-server

我创建的视图如下所示。

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

2 个答案:

答案 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;

Fiddle here

另外,如果你需要为一堆未知的周(或者我认为标准)做这件事,你可以查看使用动态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);

下面是相同的代码,结果移入临时表(由user3275​​636请求),然后显示:

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;