SQL UPDATE 和 CASE 语句不起作用
SQL UPDATE and CASE statement does not work
我在 MS SQL 服务器中有以下 table“销售”,其中 [FieldX] 未正确更新:
(..[我的评论] 当然不是 table 中的实际列)
最后 3 行应为 = 3 的原因是因为我正在使用以下规则更新字段:
with cte_previous_rows AS (
SELECT Staff_Id, LAG(FieldX) OVER (partition by Staff_Id ORDER by [date]) as Prev_Row
FROM Sales )
UPDATE Sales
SET FieldX = (CASE WHEN Staff_id_sales < 1500 AND ClosedSale = 0 THEN 0
WHEN Staff_id_sales = 1500 and CosedSale = 0 THEN 5
WHEN Staff_id_sales > 3000 and c.Prev_Row <> 2 and c.Prev_Row = 1 OR c.Prev_Row = 0 THEN 2
WHEN Staff_id_sales > 3000 and c.Prev_Row = 2 or c.Prev_Row = 3 THEN 3 END)
FROM Sales as Sales
JOIN cte_previous_rows as c
on sales.staff_id = c.staff_id
这里的想法是确定上一行在 [FieldX] 中作为值保存的内容。通过“上一行”,我指的是具有相同 staff_id 和最接近的前一个 [date]
的其他行
最后两个 WHEN 语句没有按预期工作,因为我在 Sales table 中显示了输出。
正确的输出应该是这样的:
我做错了什么?如何修复?谢谢。
请检查下一个查询:
WITH cte_previous_rows AS (
SELECT Date, Staff_Id, LAG(FieldX) OVER (partition by Staff_Id ORDER by [date]) as Prev_Row
FROM Sales
) UPDATE Sales
SET FieldX = (CASE
WHEN Staff_id_sales < 1500 AND ClosedSale = 0 THEN 0
WHEN Staff_id_sales = 1500 and ClosedSale = 0 THEN 5
WHEN Staff_id_sales > 3000 and (c.Prev_Row = 1 OR c.Prev_Row = 0) THEN 2
WHEN Staff_id_sales > 3000 and (c.Prev_Row = 2 or c.Prev_Row = 3) THEN 3
ELSE FieldX
END)
FROM Sales
JOIN cte_previous_rows as c ON Sales.staff_id = c.staff_id AND Sales.Date = c.Date;
结果:
+============+==========+================+============+========+
| Date | Staff_Id | Staff_id_sales | ClosedSale | FieldX |
+============+==========+================+============+========+
| 2000-01-01 | 1 | 500 | 0 | 0 |
+------------+----------+----------------+------------+--------+
| 2001-01-01 | 2 | 200 | 0 | 0 |
+------------+----------+----------------+------------+--------+
| 2001-02-26 | 3 | 500 | 0 | 0 |
+------------+----------+----------------+------------+--------+
| 2001-01-25 | 4 | 1500 | 0 | 5 |
+------------+----------+----------------+------------+--------+
| 2001-03-25 | 4 | 1500 | 0 | 5 |
+------------+----------+----------------+------------+--------+
| 2001-03-25 | 5 | 2500 | 0 | 1 |
+------------+----------+----------------+------------+--------+
| 2001-04-25 | 5 | 3000 | 0 | 1 |
+------------+----------+----------------+------------+--------+
| 2001-05-25 | 5 | 3500 | 0 | 2 |
+------------+----------+----------------+------------+--------+
| 2001-05-26 | 5 | 4000 | 0 | 3 |
+------------+----------+----------------+------------+--------+
| 2001-05-27 | 5 | 5000 | 0 | 3 |
+------------+----------+----------------+------------+--------+
| 2001-05-28 | 5 | 7500 | 0 | 3 |
+------------+----------+----------------+------------+--------+
我在 MS SQL 服务器中有以下 table“销售”,其中 [FieldX] 未正确更新:
(..[我的评论] 当然不是 table 中的实际列)
最后 3 行应为 = 3 的原因是因为我正在使用以下规则更新字段:
with cte_previous_rows AS (
SELECT Staff_Id, LAG(FieldX) OVER (partition by Staff_Id ORDER by [date]) as Prev_Row
FROM Sales )
UPDATE Sales
SET FieldX = (CASE WHEN Staff_id_sales < 1500 AND ClosedSale = 0 THEN 0
WHEN Staff_id_sales = 1500 and CosedSale = 0 THEN 5
WHEN Staff_id_sales > 3000 and c.Prev_Row <> 2 and c.Prev_Row = 1 OR c.Prev_Row = 0 THEN 2
WHEN Staff_id_sales > 3000 and c.Prev_Row = 2 or c.Prev_Row = 3 THEN 3 END)
FROM Sales as Sales
JOIN cte_previous_rows as c
on sales.staff_id = c.staff_id
这里的想法是确定上一行在 [FieldX] 中作为值保存的内容。通过“上一行”,我指的是具有相同 staff_id 和最接近的前一个 [date]
的其他行最后两个 WHEN 语句没有按预期工作,因为我在 Sales table 中显示了输出。
正确的输出应该是这样的:
我做错了什么?如何修复?谢谢。
请检查下一个查询:
WITH cte_previous_rows AS (
SELECT Date, Staff_Id, LAG(FieldX) OVER (partition by Staff_Id ORDER by [date]) as Prev_Row
FROM Sales
) UPDATE Sales
SET FieldX = (CASE
WHEN Staff_id_sales < 1500 AND ClosedSale = 0 THEN 0
WHEN Staff_id_sales = 1500 and ClosedSale = 0 THEN 5
WHEN Staff_id_sales > 3000 and (c.Prev_Row = 1 OR c.Prev_Row = 0) THEN 2
WHEN Staff_id_sales > 3000 and (c.Prev_Row = 2 or c.Prev_Row = 3) THEN 3
ELSE FieldX
END)
FROM Sales
JOIN cte_previous_rows as c ON Sales.staff_id = c.staff_id AND Sales.Date = c.Date;
结果:
+============+==========+================+============+========+
| Date | Staff_Id | Staff_id_sales | ClosedSale | FieldX |
+============+==========+================+============+========+
| 2000-01-01 | 1 | 500 | 0 | 0 |
+------------+----------+----------------+------------+--------+
| 2001-01-01 | 2 | 200 | 0 | 0 |
+------------+----------+----------------+------------+--------+
| 2001-02-26 | 3 | 500 | 0 | 0 |
+------------+----------+----------------+------------+--------+
| 2001-01-25 | 4 | 1500 | 0 | 5 |
+------------+----------+----------------+------------+--------+
| 2001-03-25 | 4 | 1500 | 0 | 5 |
+------------+----------+----------------+------------+--------+
| 2001-03-25 | 5 | 2500 | 0 | 1 |
+------------+----------+----------------+------------+--------+
| 2001-04-25 | 5 | 3000 | 0 | 1 |
+------------+----------+----------------+------------+--------+
| 2001-05-25 | 5 | 3500 | 0 | 2 |
+------------+----------+----------------+------------+--------+
| 2001-05-26 | 5 | 4000 | 0 | 3 |
+------------+----------+----------------+------------+--------+
| 2001-05-27 | 5 | 5000 | 0 | 3 |
+------------+----------+----------------+------------+--------+
| 2001-05-28 | 5 | 7500 | 0 | 3 |
+------------+----------+----------------+------------+--------+