tsql - 带有转换日期的 SQL Server PIVOT
问题描述
我在 SQL Server 中使用 PIVOT 时遇到了困难。
我的表有以下数据:
saleDateTime | Value |
------------------------+----------|
2018-10-30 14:29:01.000 | 87 |
2018-10-30 16:07:22.000 | 50 |
2018-10-30 16:19:36.000 | 80 |
2018-10-30 17:08:04.000 | 20 |
2018-10-30 18:09:16.000 | 35 |
2018-10-30 19:09:24.000 | 90 |
2018-10-31 13:09:41.000 | 12 |
2018-10-31 14:09:54.000 | 80 |
2018-10-31 16:18:12.000 | 30 |
我需要的是以下结果:
saleDate | 13 | 14 | 16 | 17 | 18 | 19 |
--------------+-------+-------+-------+------+------+------|
2018-10-30 | 0 | 87 | 130 | 20 | 35 | 90 |
2018-10-31 | 12 | 80 | 30 | 0 | 0 | 0 |
我需要带有销售日期的行,带有销售时间的列标题以及行的值是该日期和小时内的销售总和。
我无法绕过 PIVOT 函数来解决这种情况。我的表只有DateTime
值,我需要从该列中获取两件事:分别是日期和时间。有没有办法使用PIVOT
aCONVERT
来完成这项工作?
提前致谢!
解决方案
以下是如何使用PIVOT来获得所需的结果 - 转换salesDateTime
为date
删除时间部分,并按小时旋转,计算为DATEPART(hour, saleDateTime)
:
declare @Sales table(saleDateTime datetime, Value int)
insert into @Sales (saleDateTime, Value) values
('2018-10-30 14:29:01.000', 87),
('2018-10-30 16:07:22.000', 50),
('2018-10-30 16:19:36.000', 80),
('2018-10-30 17:08:04.000', 20),
('2018-10-30 18:09:16.000', 35),
('2018-10-30 19:09:24.000', 90),
('2018-10-31 13:09:41.000', 12),
('2018-10-31 14:09:54.000', 80),
('2018-10-31 16:18:12.000', 30)
SELECT
saleDate
, ISNULL([0], 0) as [0]
, ISNULL([1], 0) as [1]
, ISNULL([2], 0) as [2]
, ISNULL([3], 0) as [3]
, ISNULL([4], 0) as [4]
, ISNULL([5], 0) as [5]
, ISNULL([6], 0) as [6]
, ISNULL([7], 0) as [7]
, ISNULL([8], 0) as [8]
, ISNULL([9], 0) as [9]
, ISNULL([10], 0) as [10]
, ISNULL([11], 0) as [11]
, ISNULL([12], 0) as [12]
, ISNULL([13], 0) as [13]
, ISNULL([14], 0) as [14]
, ISNULL([15], 0) as [15]
, ISNULL([16], 0) as [16]
, ISNULL([17], 0) as [17]
, ISNULL([18], 0) as [18]
, ISNULL([19], 0) as [19]
, ISNULL([20], 0) as [20]
, ISNULL([21], 0) as [21]
, ISNULL([22], 0) as [22]
, ISNULL([23], 0) as [23]
FROM
(SELECT cast(saleDateTime as DATE) as saleDate, Value, DATEPART(hour, saleDateTime) as saleHour FROM @Sales) AS SourceTable
PIVOT
(
SUM(Value)
FOR saleHour IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11],
[12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23])
) AS PivotTable;
我添加了所有时间,但如有必要,您可以删除不需要的时间段。
推荐阅读
- python - 具有部分字符串匹配的列表理解
- macos - Homebrew 安装出现错误
- tsql - UPDATE SQL 命令不保存结果
- java - 包含对对象的引用的 Java 数组
- amazon-web-services - 使用 Chalice 向 AWS API Gateway 响应添加标头
- javascript - 如何让 owlCarousel 中的一张幻灯片比其他幻灯片停留的时间更长
- java - 等待函数完成,直到回调到来
- ssl - aks cert-manager 不使用lets-encrypt 创建证书
- python - 使用 keras 在 2D 数据上输出 1D 卷积的形状
- kubernetes - 嵌入式 Hazelcast 无法加入 Kubernetes 集群