[英]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_sales
一Like_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
54321的Like_for_like_sales
某些Like_for_like_sales
NULL,因此,具有Filial_number
54321的Like_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.