【问题标题】:SQL Server : exclude rows with NULL values after CASE expressionSQL Server:在 CASE 表达式后排除具有 NULL 值的行
【发布时间】:2015-12-27 10:31:25
【问题描述】:

下面的查询以我想要的方式聚合来自日志记录表的数据...

SELECT 
    [TransactionNumber]
    ,MIN(CASE WHEN [Entry] = 'Updated status to Awaiting OCLC Sending' THEN [DateTime] END) AS 'start' 
    ,MAX(CASE WHEN [Entry] = 'Updated Status to: Delivered to Web' THEN [DateTime] END) AS 'end' 
    FROM [ILLData].[dbo].[History]
    GROUP BY [TransactionNumber] 
    /*
    227882  2015-09-29 14:17:07.443 2015-09-29 15:27:03.180
    227883  NULL    NULL
    227884  2015-09-29 14:29:22.340 NULL
    227885  NULL    2015-09-29 14:59:54.677
    */

...但我想排除任何包含 NULL 值的结果行。我尝试了下面的查询,但我一直得到相同的结果,并且没有排除具有 NULL 值的行。

SELECT 
    [TransactionNumber]
    ,MIN(CASE WHEN [Entry] = 'Updated status to Awaiting OCLC Sending' THEN [DateTime] END) AS 'start' 
    ,MAX(CASE WHEN [Entry] = 'Updated Status to: Delivered to Web' THEN [DateTime] END) AS 'end' 
FROM 
    [ILLData].[dbo].[History]
WHERE 
    'start' IS NOT NULL 
    AND 'end' IS NOT NULL 
GROUP BY 
    [TransactionNumber] 

/* still get rows with NULL values */

SELECT 
    [TransactionNumber]
    ,MIN(CASE WHEN [Entry] = 'Updated status to Awaiting OCLC Sending' THEN [DateTime] END) AS 'start' 
    ,MAX(CASE WHEN [Entry] = 'Updated Status to: Delivered to Web' THEN  [DateTime] END) AS 'end' 
FROM 
    [ILLData].[dbo].[History] 
GROUP BY  
    [TransactionNumber] 
HAVING 
    'start' IS NOT NULL 
    AND 'end' IS NOT NULL

/* still get rows with NULL values */

WITH history AS 
(
   SELECT  
       [TransactionNumber]
       ,MIN(CASE WHEN [Entry] = 'Updated status to Awaiting OCLC Sending' THEN [DateTime] END) AS 'start' 
       ,MAX(CASE WHEN [Entry] = 'Updated Status to: Delivered to Web' THEN [DateTime] END) AS 'end' 
   FROM 
       [ILLData].[dbo].[History]
   GROUP BY 
       [TransactionNumber])
SELECT * 
FROM history 
WHERE 'start' IS NOT NULL 
  AND 'end' IS NOT NULL 

/* still get rows with NULL values */

有没有办法过滤我使用CASE的查询结果?

【问题讨论】:

    标签: sql-server max case min


    【解决方案1】:

    问题在于您的字段名称,因为“开始”永远不会为空,因为 SQL 将文本值与空值进行比较。稍有改变,您的查询就可以了。

    SELECT *
    FROM
    (SELECT 
    [TransactionNumber]
    ,MIN(CASE WHEN [Entry] = 'Updated status to Awaiting OCLC Sending' THEN [DateTime] END) AS [start] 
    ,MAX(CASE WHEN [Entry] = 'Updated Status to: Delivered to Web' THEN [DateTime] END) AS [end] 
    FROM [ILLData].[dbo].[History]
    GROUP BY [TransactionNumber]) x
    WHERE [start] IS NOT NULL 
    AND [end] IS NOT NULL 
    

    【讨论】:

    • Rafal,当我尝试这个时,我得到一个错误:Msg 207, Level 16, State 1, Line 8 Invalid column name 'start'. Msg 207, Level 16, State 1, Line 9 Invalid column name 'end'.
    • 现在应该好了。我忘记了在“SELECT”之前执行了“Having”。
    • Dziękuję !!!有用。所以看起来查询需要嵌套。感谢您的帮助。
    • Nie ma za co :) 如果你想使用别名,它应该是嵌套的,但你可以使用 with MIN(CASE WHEN [Entry] = 'Updated status to Awaiting OCLC Sending' THEN [DateTime] END) 不为空
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多