我面临的挑战是限制过去 90 天的数据运行,但要考虑到一组 ID 可能有不同的数据输入日期。如果我只是运行查询将数据限制为最近 90 天,它不会总是提取所有分组数据(每组 6 个数据)。大多数情况下,数据输入将在同一天完成。然而,有时我们没有这些值,因此数据会在第二天或几周后输入。我正在尝试解决以下问题:如果 5 项活动中的任何一项的输入日期在 90 天内,则可以获取可能早于 90 岁的同伴分组数据,以便它显示在报告中。
我有这个原始表(注意,我必须从活动代码中导出列)。
项目ID | 活动代码 | 活动说明 | 活动结果 | DTTM |
---|---|---|---|---|
123456 | 15 | 客户ID | 999 | 24/4/24 18:01 |
123456 | 16 | 发票没有 | 11232 | 24/4/24 18:01 |
123456 | 1745 | 类别颜色 | 绿色 | 4/25/24 9:01 |
123456 | 2256 | 尺寸 | 大 | 4/25/24 9:21 |
123456 | 4748 | 数量 | 7 | 24/4/25 10:05 |
654321 | 15 | 客户ID | 1745 | 24/26/4 11:15 |
654321 | 16 | 发票没有 | 19121 | 24/26/4 11:15 |
654321 | 1745 | 类别颜色 | 蓝色 | 24/26/4 11:15 |
654321 | 2256 | 尺寸 | 中 | 24/26/4 11:15 |
654321 | 4748 | 数量 | 10 | 24/26/4 11:15 |
171718 | 15 | 客户ID | 149 | 24/20/4 13:25 |
171718 | 16 | 发票没有 | 12001 | 24/20/4 13:25 |
171718 | 1745 | 类别颜色 | 黄色 | 24/22/4 12:05 |
171718 | 2256 | 尺寸 | 小 | 24/22/4 12:05 |
171718 | 4748 | 数量 | 3 | 24/22/4 12:05 |
我想要得到的结果是这样的:
项目ID | 客户ID | 发票没有 | 类别颜色 | 尺寸 | 数量 | DTTM |
---|---|---|---|---|---|---|
123456 | 999 | 11232 | 绿色 | 大 | 7 | 24/4/25 10:05 |
654321 | 1745 | 19121 | 蓝色 | 中 | 10 | 24/26/4 11:15 |
171718 | 149 | 12001 | 黄色 | 小 | 3 | 24/22/4 12:05 |
这是小提琴代码:https://sqlfiddle.com/sql-server/online-compiler?id=7bcda154-e51a-4ad7-85ef-5f4149af8b73。以防万一小提琴链接不起作用,这是我的代码:
CREATE TABLE Customer (
ProjectID INT
,ActivityCode VARCHAR(10)
,ActivityDescription VARCHAR(25)
,ActivityResults VARCHAR (25)
,DTTM DATETIME
);
INSERT INTO Customer(ProjectID, ActivityCode ,ActivityDescription ,ActivityResults ,DTTM) VALUES ('123456', '15', 'CustomerID', '999', '4/24/24 18:01');
INSERT INTO Customer(ProjectID, ActivityCode ,ActivityDescription ,ActivityResults ,DTTM) VALUES ('123456', '16', 'InvoiceNo', '11232', '4/24/24 18:01');
INSERT INTO Customer(ProjectID, ActivityCode ,ActivityDescription ,ActivityResults ,DTTM) VALUES ('123456', '1745', 'CategoryColor', 'Green', '4/25/2024 09:01');
INSERT INTO Customer(ProjectID, ActivityCode ,ActivityDescription ,ActivityResults ,DTTM) VALUES ('123456', '2256', 'Size', 'Large', '4/25/2024 09:21');
INSERT INTO Customer(ProjectID, ActivityCode ,ActivityDescription ,ActivityResults ,DTTM) VALUES ('123456', '4748', 'Quantity', '7', '4/25/2024 10:05');
INSERT INTO Customer(ProjectID, ActivityCode ,ActivityDescription ,ActivityResults ,DTTM) VALUES ('654321', '15', 'CustomerID', '1745', '4/26/2024 11:15');
INSERT INTO Customer(ProjectID, ActivityCode ,ActivityDescription ,ActivityResults ,DTTM) VALUES ('654321', '16', 'InvoiceNo', '19121', '4/26/2024 11:15');
INSERT INTO Customer(ProjectID, ActivityCode ,ActivityDescription ,ActivityResults ,DTTM) VALUES ('654321', '1745', 'CategoryColor', 'Blue', '4/26/2024 11:15');
INSERT INTO Customer(ProjectID, ActivityCode ,ActivityDescription ,ActivityResults ,DTTM) VALUES ('654321', '2256', 'Size', 'Medium', '4/26/2024 11:15');
INSERT INTO Customer(ProjectID, ActivityCode ,ActivityDescription ,ActivityResults ,DTTM) VALUES ('654321', '4748', 'Quantity', '10', '4/26/2024 11:15');
INSERT INTO Customer(ProjectID, ActivityCode ,ActivityDescription ,ActivityResults ,DTTM) VALUES ('171718', '15', 'CustomerID', '149', '4/20/2024 13:25');
INSERT INTO Customer(ProjectID, ActivityCode ,ActivityDescription ,ActivityResults ,DTTM) VALUES ('171718', '16', 'InvoiceNo', '12001', '4/20/2024 13:25');
INSERT INTO Customer(ProjectID, ActivityCode ,ActivityDescription ,ActivityResults ,DTTM) VALUES ('171718', '1745', 'CategoryColor', 'Yellow', '4/22/2024 12:05');
INSERT INTO Customer(ProjectID, ActivityCode ,ActivityDescription ,ActivityResults ,DTTM) VALUES ('171718', '2256', 'Size', 'Small', '4/22/2024 12:05');
INSERT INTO Customer(ProjectID, ActivityCode ,ActivityDescription ,ActivityResults ,DTTM) VALUES ('171718', '4748', 'Quantity', '3', '4/22/2024 12:05');
-- QUERY database
--SELECT * FROM Customer;
SELECT
main.ProjectID
,custid.ActivityResults CustomerID
,invno.ActivityResults InvoiceNo
,color.ActivityResults CategoryColor
,size.ActivityResults Size
,qty.ActivityResults Quantity
,DTTM
FROM (SELECT
ProjectID
,ActivityCode
,ActivityDescription
,ActivityResults
,DTTM
From Customer
WHERE ActivityCode IN (15,16,1745,2256,4748)) main
LEFT JOIN (SELECT
ProjectID
,ActivityCode
,ActivityDescription
,ActivityResults
FROM Customer
WHERE ActivityCode = 15) custid ON main.ProjectID = custid.ProjectID
LEFT JOIN (SELECT
ProjectID
,ActivityCode
,ActivityDescription
,ActivityResults
FROM Customer
WHERE ActivityCode = 16) invno ON main.ProjectID = invno.ProjectID
LEFT JOIN (SELECT
ProjectID
,ActivityCode
,ActivityDescription
,ActivityResults
FROM Customer
WHERE ActivityCode = 1745) color ON main.ProjectID = color.ProjectID
LEFT JOIN (SELECT
ProjectID
,ActivityCode
,ActivityDescription
,ActivityResults
FROM Customer
WHERE ActivityCode = 2256) size ON main.ProjectID = size.ProjectID
LEFT JOIN (SELECT
ProjectID
,ActivityCode
,ActivityDescription
,ActivityResults
FROM Customer
WHERE ActivityCode = 4748) qty ON main.ProjectID = qty.ProjectID
LEFT JOIN (SELECT
ProjectID
,ActivityCode
,ActivityDescription
,ActivityResults
,ROW_NUMBER() OVER (PARTITION BY ProjectID, CASE WHEN ActivityCode = 15 THEN 1 ELSE 0 END, CASE WHEN ActivityCode = 16 THEN 1 ELSE 0 END ORDER BY DTTM DESC) RN
FROM Customer
) MaxDTTM ON main.ProjectID = MaxDTTM.ProjectID
WHERE RN = 1
谢谢您的建议
with cte1 as (
select *, min(datediff(day,DTTM,getdate())) over (partition by ProjectId) Age
from Customer
)
select
ProjectId
, max(case when ActivityCode = 15 then ActivityResults else null end) CustomerId
, max(case when ActivityCode = 16 then ActivityResults else null end) InvoiceNo
, max(case when ActivityCode = 1745 then ActivityResults else null end) CategoryColor
, max(case when ActivityCode = 2256 then ActivityResults else null end) [Size]
, max(case when ActivityCode = 4748 then ActivityResults else null end) Quantity
, max(case when ActivityCode = 4748 then DTTM else null end) DTTM
from cte1
where Age < 90
group by ProjectId;