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

标签 sql sql-server

我创建了如下 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;

Fiddle here

此外,如果您需要在一系列未知周(或标准,我猜)中执行此操作,您可以查看 answer here它使用动态 sql 构建列并执行数据透视表。

关于sql - 需要 SQL 数据透视帮助,因为我没有聚合列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21581124/

相关文章:

mysql - 为什么复合主键还在?

sql - 如果两个序列之间的差异大于30,则扣除更大的序列

mysql - 删除所有重复的主题,条件很少

java - 如何修复线程 "main"org.hibernate.exception.SQLGrammarException : could not execute native bulk manipulation query? 中的异常

java - 无法获取时间戳值

sql - 按sql中的另一列对具有重复值的列进行排序

sql-server - 插入复杂有序组计数器

sql - 如何使用存储过程获取所有 SSRS 订阅数据?

c++ - 如何使 =NULL 在 SQLite 中工作?

mysql - 为什么 MySQL 不使用我的 FULLTEXT 索引?