TSQL:如果一行的某一列为NULL,则根据另一行将每隔一列设置为NULL

时间:2019-01-10 10:06:03

标签: sql tsql reporting-services

这是我对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_number 54321 的某些列为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

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以应用窗口聚合:

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

答案 1 :(得分:0)

您可以使用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