t sql 基于行日期的派生列

Posted

技术标签:

【中文标题】t sql 基于行日期的派生列【英文标题】:t sql derive column based on date of row 【发布时间】:2018-11-20 19:40:07 【问题描述】:

我很抱歉问了一个我确信已经回答了很多次的问题,但我无法用词来搜索它。即使是类似问题的链接也将不胜感激。

如果我有这样的表:

+----+----------+-----+
|Name|Date      |Score|
+----+----------+-----+
| Tom|2018-20-11|  100|
| Tom|2018-13-11|   95|
+----+----------+-----+

我将如何查询这一点,以便每一行显示今天的得分、一周前的得分等列?在这个带有样本数据的示例中,它将是一行,例如

+----+----------+-----------+
|Name|ScoreToday|Score-7Days|
+----+----------+-----------+
| Tom|       100|         95|
+----+----------+-----------+

我已经看到通过交叉应用购买解决了类似的问题,但我无法解决。感谢您的帮助:)

一些示例代码:

if exists (select * from sys.tables where name = 'test') drop table test
go
create table test (
    Name varchar(128)
    , AsAt datetime
    , Score int
)

insert test values ('Tom', getdate(), 87)
    , ('Tom', getdate() - 2, 100)
    , ('Tom', getdate() - 7, 95)
    , ('Tom', getdate() - 1, 81)
    , ('Tom', getdate() - 30, 95)

【问题讨论】:

输入表中每个名称可以有多少个日期? 您要合并和聚合吗?还是您只想将行转为列? 从今天开始会一直是 7 天吗?或者今天的分数和最近7天的分数还是那个? 这称为枢轴。大量关于 *** 的示例。 感谢您的建议,会有很多日期,我想要一些样本,我不认为我想要聚合,只想要将某些日期作为列的行,例如一周前、一个月前、3 个月前 如果可以在枢轴/取消枢轴/交叉应用中完成,我希望在此示例中看到它,我将不胜感激。谢谢 【参考方案1】:

我想你正在寻找

CREATE TABLE T
    ([Name] varchar(4), [Date] datetime, [Score] int);

INSERT INTO T
    ([Name], [Date], [Score])
VALUES
    ('Tom', '2018-11-20 00:00:00', 100),
    ('Tom', '2018-11-13 00:00:00', 95),
    ('Sami', '2018-11-13 00:00:00', 55),
    ('Sami', '2018-11-15 00:00:00', 44);

DECLARE @Dates NVARCHAR(MAX) = '';
DECLARE @SQL NVARCHAR(MAX);
SELECT @Dates = @Dates + ',' + QUOTENAME([Date])
FROM T
GROUP BY [Date];

SET @Dates = STUFF(@Dates, 1, 1, '');

SET @SQL = N' SELECT * FROM(SELECT * FROM T) TT PIVOT( MAX(Score) FOR [Date] IN ('+ @Dates +')) PVT;';
EXECUTE sp_executesql @SQL;

返回:

+------+---------------------+---------------------+---------------------+
| Name | Nov 13 2018 12:00AM | Nov 15 2018 12:00AM | Nov 20 2018 12:00AM |
+------+---------------------+---------------------+---------------------+
| Sami |                  55 |                  44 |                     |
| Tom  |                  95 |                     |                 100 |
+------+---------------------+---------------------+---------------------+

Demo

【讨论】:

差不多了,是不是取日期的动态sql?因为如果它可以在没有动态 sql 的情况下完成,我总是会选择今天之前的某个天数。感谢您的帮助

以上是关于t sql 基于行日期的派生列的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL 查询以获取从今天起 +30 天的日期

基于多个日期列创建最小日期列的 SQL 代码 [重复]

t-sql 从平面日期列表中总结日期范围,按其他列分组

SQL — 获取 A 列日期与 B 列日期相差 7 天的所有行

将 SQL 中的 VARCHAR 列转换为日期时间格式?

使用 SSIS 派生列提取日期值