转置后(行到列)分组在 3 列的行中查找最大日期

问题描述 投票:0回答:1

我面临的挑战是限制过去 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

谢谢您的建议

sql sql-server
1个回答
0
投票
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;
© www.soinside.com 2019 - 2024. All rights reserved.