这是我对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
感谢您的帮助!
答案 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