【问题标题】:TSQL: CASE if one column of a row is NULL every other column will be set NULL depending on another rowTSQL:如果一行的一列为NULL,则每隔一列将根据另一行设置为NULL
【发布时间】:2019-06-05 04:16:00
【问题描述】:

这是我关于 stackoverflow 的第一个问题,如果它不是那么容易理解,我很抱歉。 我不知道这是否可能。

这是一个 TSQL 查询示例:

+--------+---------------------+---------------+-------+--------------------+
| Month  | Like_for_like_sales | Filial_number | Sales | PreviousYear_Sales |
+--------+---------------------+---------------+-------+--------------------+
| 201712 | 1                   |         12345 |   132 | 164                |
| 201801 | 1                   |         12345 |   143 | 167                |
| 201802 | 1                   |         12345 |   145 | 134                |
| 201803 | 1                   |         12345 |   165 | 176                |
| 201804 | 1                   |         12345 |   164 | 145                |
| 201805 | 1                   |         12345 |   186 | 145                |
| 201806 | 1                   |         12345 |   176 | 165                |
| 201807 | 1                   |         12345 |   187 | 121                |
| 201808 | 1                   |         12345 |   134 | 134                |
| 201809 | 1                   |         12345 |   123 | 165                |
| 201810 | 1                   |         12345 |   111 | 134                |
| 201811 | 1                   |         12345 |   143 | 156                |
| 201712 | NULL                |         54321 |   132 | NULL               |
| 201801 | NULL                |         54321 |   143 | NULL               |
| 201802 | NULL                |         54321 |   145 | NULL               |
| 201803 | NULL                |         54321 |   165 | NULL               |
| 201804 | NULL                |         54321 |   164 | NULL               |
| 201805 | NULL                |         54321 |   186 | NULL               |
| 201806 | NULL                |         54321 |   176 | 165                |
| 201807 | 1                   |         54321 |   187 | 121                |
| 201808 | 1                   |         54321 |   134 | 134                |
| 201809 | 1                   |         54321 |   123 | 165                |
| 201810 | 1                   |         54321 |   111 | 134                |
| 201811 | 1                   |         54321 |   143 | 156                |
+--------+---------------------+---------------+-------+--------------------+

现在我希望如果Like_for_like_sales 的一列是NULL,那么特定Filial_number 的每一列也应该是NULL

在此示例中,Like_for_like_sales 的某些列与 Filial_number54321 为 NULL,因此 Like_for_like_sales 的所有其他列与Filial_number 54321也应该设置为NULL。

最后应该是这样的:

+--------+---------------------+---------------+-------+--------------------+
| Month  | Like_for_like_sales | Filial_number | Sales | PreviousYear_Sales |
+--------+---------------------+---------------+-------+--------------------+
| 201712 | 1                   |         12345 |   132 | 164                |
| 201801 | 1                   |         12345 |   143 | 167                |
| 201802 | 1                   |         12345 |   145 | 134                |
| 201803 | 1                   |         12345 |   165 | 176                |
| 201804 | 1                   |         12345 |   164 | 145                |
| 201805 | 1                   |         12345 |   186 | 145                |
| 201806 | 1                   |         12345 |   176 | 165                |
| 201807 | 1                   |         12345 |   187 | 121                |
| 201808 | 1                   |         12345 |   134 | 134                |
| 201809 | 1                   |         12345 |   123 | 165                |
| 201810 | 1                   |         12345 |   111 | 134                |
| 201811 | 1                   |         12345 |   143 | 156                |
| 201712 | NULL                |         54321 |   132 | NULL               |
| 201801 | NULL                |         54321 |   143 | NULL               |
| 201802 | NULL                |         54321 |   145 | NULL               |
| 201803 | NULL                |         54321 |   165 | NULL               |
| 201804 | NULL                |         54321 |   164 | NULL               |
| 201805 | NULL                |         54321 |   186 | NULL               |
| 201806 | NULL                |         54321 |   176 | 165                |
| 201807 | NULL                |         54321 |   187 | 121                |
| 201808 | NULL                |         54321 |   134 | 134                |
| 201809 | NULL                |         54321 |   123 | 165                |
| 201810 | NULL                |         54321 |   111 | 134                |
| 201811 | NULL                |         54321 |   143 | 156                |
+--------+---------------------+---------------+-------+--------------------+

这是我为这个问题做的示例查询,所以你可以自己尝试一下:

WITH test (MONTH, Like_for_like_sales, Filial_number, Sales, PreviousYear_Sales) AS
 (
   SELECT  201712, 1, 12345, 132, 164 
   UNION 
   SELECT  201801, 1, 12345, 143, 167 
   UNION 
   SELECT  201803, 1, 12345, 165, 176 
   UNION 
   SELECT  201804, 1, 12345, 164, 145 
   UNION 
   SELECT  201805, 1, 12345, 186, 145 
   UNION 
   SELECT  201806, 1, 12345, 176, 165 
   UNION 
   SELECT  201807, 1, 12345, 187, 121 
   UNION 
   SELECT  201808, 1, 12345, 134, 134 
   UNION 
   SELECT  201809, 1, 12345, 123, 165 
   UNION 
   SELECT  201810, 1, 12345, 111, 134 
   UNION 
   SELECT  201811, 1, 12345, 143, 156 
   UNION 
   SELECT  201712, NULL, 54321, 132, NULL 
   UNION 
   SELECT  201801, NULL, 54321, 143, NULL 
   UNION 
   SELECT  201802, NULL, 54321, 145, NULL 
   UNION 
   SELECT  201803, NULL, 54321, 165, NULL 
   UNION 
   SELECT  201804, NULL, 54321, 164, NULL 
   UNION 
   SELECT  201805, NULL, 54321, 186, NULL 
   UNION 
   SELECT  201806, NULL, 54321, 176, 165 
   UNION 
   SELECT  201807, 1, 54321, 187, 121 
   UNION 
   SELECT  201808, 1, 54321, 134, 134 
   UNION 
   SELECT  201809, 1, 54321, 123, 165 
   UNION 
   SELECT  201810, 1, 54321, 111, 134 
   UNION 
   SELECT  201811, 1, 54321, 143, 156
 ) 
SELECT Month, Like_for_like_sales, Filial_number, Sales, PreviousYear_Sales 
FROM test 
ORDER BY Filial_number, Month

感谢您的帮助!

【问题讨论】:

标签: sql tsql reporting-services


【解决方案1】:

您可以使用CASE

SELECT Month, CASE WHEN EXISTS (
      SELECT 1
      FROM test t2
      WHERE t1.Filial_number = t2.Filial_number and 
            t2.Like_for_like_sales is null and
            t2.Month < t1.Month
    ) THEN NULL ELSE Like_for_like_sales END, 
       Filial_number, Sales, PreviousYear_Sales 
FROM test t1
ORDER BY Filial_number, Month

【讨论】:

    【解决方案2】:

    您可以应用窗口聚合:

    SELECT  MONTH,
            case when -- any of the rows for a filial for a NULL
                      min(case when Like_for_like_sales is null then 0 end)
                      over (partition by Filial_number) = 0 
                 then null
                 else Like_for_like_sales
            end,
            Filial_number,
            Sales,
            PreviousYear_Sales 
    FROM    test 
    ORDER BY Filial_number,
            MONTH
    

    db<>fiddle

    【讨论】:

    • 谢谢,这太棒了!完美运行。
    • @GordonLinoff:它正在寻找 any 而不是 all NULL。
    • @dnoeth 。 . . count(Like_for_like_sales) = 0.
    • @GordonLinoff: ... 将检查每个Filial_number所有 行是否为NULL,但不是any
    猜你喜欢
    • 2023-03-16
    • 2018-03-15
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2018-01-05
    • 2014-07-02
    • 1970-01-01
    相关资源
    最近更新 更多