如何在多个日期行上透视表[重复]

Posted

技术标签:

【中文标题】如何在多个日期行上透视表[重复]【英文标题】:How to pivot table on multiple date rows [duplicate] 【发布时间】:2021-06-07 09:35:54 【问题描述】:

我正在尝试旋转 SQL Server 表,同时还按日期列分组。

这是我的示例数据:

date ref count
07/06/21 ref1 20
08/06/21 ref1 2
09/06/21 ref1 15
07/06/21 ref2 54
08/06/21 ref2 23

以及结果需要如何:

ref 07/06/21 08/06/21 09/06/21
ref1 20 2 15
ref2 54 23

是否可以使用 SQL Server PIVOT 执行此操作,还是需要其他东西来进行分组?

日期也是动态的,并且基于日期范围。

【问题讨论】:

你为什么不试试看? 透视是一种聚合形式,所以是的,你需要一个GROUP BY。此外,如果这些日期不是一成不变的(我对此表示怀疑),您将需要一个动态支点。 这能回答你的问题吗? Convert Rows to columns using 'Pivot' in SQL Server 这能回答你的问题吗? SQL Server dynamic PIVOT query? 另外,您真的在使用 SQL Server 2008 吗?现在已经完全不支持2年了~。 【参考方案1】:

您需要动态数据透视查询才能在查询下方尝试执行此操作

declare @columns varchar(max)='',@sql nvarchar(max);

Create table #temp (Name nvarchar(max));

insert into #temp select distinct date from tablename

SELECT @columns+=QUOTENAME(Name) + ',' from #temp
SET @columns = LEFT(@columns, LEN(@columns) - 1);


set @sql='SELECT * FROM
(select ref,count,date from tablename) t

PIVOT(sum([count])
FOR [Dates] IN ('+@columns+')
) AS pivot_table'
EXEC (@sql)

drop table #temp

【讨论】:

【参考方案2】:
SELECT C.REF,
SUM(
      CASE
         WHEN C.DATE='07/06/21' THEN C.COUNT ELSE 0 END
   )AS '07_06_21',
SUM(
      CASE
       WHEN C.DATE='08/06/21' THEN C.COUNT ELSE 0 END
   )AS '08_06_21',
SUM(
    CASE
       WHEN C.DATE='09/06/21' THEN C.COUNT ELSE 0 END
  )AS '09_06_21'
 FROM my_example_data AS C
 GROUP BY C.REF

您可以随时尝试这种条件聚合方法

【讨论】:

不幸的是日期是动态的,所以在这种情况下这对我不起作用,但谢谢。 那么你的方式就是“动态支点”***.com/questions/10404348/…【参考方案3】:
SELECT ref, [07/06/21],[08/06/21],[09/06/21] FROM
(SELECT ref, date , [count] FROM tableName) t1
PIVOT  
(  
 SUM([count]) FOR [date] IN ([07/06/21],[08/06/21],[09/06/21])) AS t2
ORDER BY t2.ref

【讨论】:

一个好的答案提供了一个描述,以便 OP 可以学习,除了希望工作的代码。

以上是关于如何在多个日期行上透视表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

按日期显示多个值的数据透视表

Python:一次包含重复值的多个列的 Pandas 数据透视表

使用 VBA 根据下拉选择过滤多个数据透视表

如何把SQL数据表中一个字段的值按逗号分隔存入另外一个表,并删除重复记录?

Pandas:如何在数据透视表数据框中仅添加最新日期

数据透视表提示重复值