SQL 如何向数据透视表内的聚合函数添加条件?

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

我尝试为该数据库中的所有相关时间戳创建一个数据透视表,但发现数据透视表的聚合语句中的 MAX() 函数返回了我不一定想要的值。我正在尝试跟踪时间戳以查看瓶颈和事件之间的平均时间。

对于该数据库,每个事件都有一条记录,并且每个事件都有时间戳。某些事件可以被“清除”,但这些事件也被记录为具有自己的时间戳的事件(它们被标记为“已清除”= 1 事件)。假设订单已完成,然后被清除 - 当我拉动该订单的 MAX(EventTimeStamp) 时,我将获得清除的时间戳,当我尝试查看数据时,这可能会产生误导。相反,我想返回 NULL 值。

原始数据如下:

案例 状态 事件时间戳 已清除
1 订单已收到 2024-03-20 12:20 0
1 已完成 2024-03-20 12:51 0
1 已完成 2024-03-20 12:55 1
2 订单已收到 2024-03-21 10:00 0
2 已完成 2024-03-22 08:00 0

我想针对许多不同的情况跟踪可能有 25 种不同的状态,这就是为什么我将其旋转为如下所示

案例 订单已收到 已完成
1 2024-03-20 12:20 2024-03-20 12:55
2 2024-03-21 10:00 2024-03-22 08:00

对于这些情况,我想要一张像这样的表格。由于最后一个已完成的事件是“已清除”事件,我希望它读取为 NULL:

案例 订单已收到 已完成
1 2024-03-20 12:20
2 2024-03-21 10:00 2024-03-22 08:00

这是数据透视表的精简查询:

SELECT [CaseID]
    ,[OrderReceived]
    ,[Completed]

FROM (SELECT [CaseID]
        ,[Cleared]
        ,[State]
        ,[EventTimeStamp]   
    FROM CaseTracking
        ) AS SourceTable

PIVOT (
    MAX(EventTimeStamp)
    FOR [State] IN ([OrderReceived]
    ,[Completed])) AS PivotTable

说实话,我不知道该怎么做。我考虑过使用 CASE 语句与 MAX() 函数配对,但我不知道如何评估与 MAX(EventTimeStamp) 配对的 Cleared 变量。

我确实知道,用外行的话来说,我的条件语句是这样的: 如果 MAX(EventTimeStamp) 的“已清除”值 = 0,则返回 MAX(EventTimeStamp)。 如果 MAX(EventTimeStamp) 的“已清除”值 = 1,则返回 NULL。

任何指导将不胜感激!

sql t-sql conditional-statements pivot case
1个回答
0
投票

我使用了 SQL Server - PIVOT on CASE statements 中的建议,并使用“1990-1-1”作为 NULL 的临时替代。

CREATE TABLE CaseTracking 
(
    [Case]  VARCHAR(512),
    [State] VARCHAR(512),
    EventTimeStamp  VARCHAR(512),
    Cleared VARCHAR(512)
);

INSERT INTO CaseTracking ([Case], [State], EventTimeStamp, Cleared) VALUES
    ('1', 'OrderReceived', '2024-03-20 12:20', '0'),
    ('1', 'Completed', '2024-03-20 12:51', '0'),
    ('1', 'Completed', '2024-03-20 12:55', '1'),
    ('2', 'OrderReceived', '2024-03-21 10:00', '0'),
    ('2', 'Completed', '2024-03-22 08:00', '0');

SELECT * FROM CaseTracking


SELECT [CASE]    
      ,MAX([OrderReceived]) as [OrderReceived] 
      ,CASE MIN([Completed]) WHEN '1990-1-1' THEN NULL ELSE MIN([Completed]) END as [Completed]
FROM
(
  
SELECT [Case]
    ,[OrderReceived]
    ,[Completed]

FROM (SELECT [Case]
        ,[Cleared]
        ,[State]
        ,[EventTimeStamp]  
        ,CASE [CLEARED]  WHEN 1 THEN '1990-1-1' ELSE [EventTimeStamp] END as ets
     
    FROM CaseTracking
        ) AS SourceTable

PIVOT (
    MAX(ets)
    FOR [State] IN ([OrderReceived]
    ,[Completed])) AS PivotTable

) t
GROUP BY [CASE]

小提琴

案例 订单已收到 已完成
1 2024-03-20 12:20
2 2024-03-21 10:00 2024-03-22 08:00
© www.soinside.com 2019 - 2024. All rights reserved.