简体   繁体   English

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

[英]TSQL: CASE if one column of a row is NULL every other column will be set NULL depending on another row

this is my first question on stackoverflow so sorry if its not that understandable. 这是我对stackoverflow的第一个问题,对不起,如果不能理解的话。 I don't know if this is even possible. 我不知道这是否有可能。

This is a example of the TSQL query: 这是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                |
+--------+---------------------+---------------+-------+--------------------+

Now i want that if one column of the Like_for_like_sales is NULL , then every other column for the specific Filial_number should also be NULL 现在,我希望如果Like_for_like_salesLike_for_like_sales NULL ,则特定Filial_number每隔一列也应为NULL

In this example, some columns of Like_for_like_sales with the Filial_number 54321 are NULL, so every other column of Like_for_like_sales with the Filial_number 54321 should also be set to NULL. 在此示例中,具有Filial_number 54321Like_for_like_sales某些Like_for_like_sales NULL,因此,具有Filial_number 54321Like_for_like_sales其他每一列也应设置为NULL。

In the end, it should look that way: 最后,它应该是这样的:

+--------+---------------------+---------------+-------+--------------------+
| 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                |
+--------+---------------------+---------------+-------+--------------------+

Here is the example query i made for this question, so you can try it by yourself: 这是我对此问题进行查询的示例,因此您可以自己尝试:

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

Thanks for your help! 谢谢你的帮助!

You can apply a Windowed Aggregate: 您可以应用窗口聚合:

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

See db<>fiddle 参见db <> fiddle

You may use CASE 您可以使用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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM