我不是SQL专家,但我无法理解为什么我使用以下代码收到错误:http://sqlfiddle.com/#!3/2de76/7。请有人告诉我这有什么问题。感谢。
DECLARE @total INT
SET @total = 0
SELECT
s1.RowCountID,
CASE
WHEN s1.dayTotal < s2.dayTotal THEN @total = @total
WHEN s1.dayTotal > s2.dayTotal THEN @total = @total + (s1.dayTotal - s2.dayTotal)
END AS res,
s1.dayTotal,
s2.dayTotal
FROM simple_summary s1
JOIN simple_summary s2 ON s2.RowCountID = s1.RowCountID - 1
ORDER BY s1.RowCountID ASC
预期产出:
rowCount,res,dayTotal,dayTotal
1,3,3,0
2,4,4,3
3,4,3,4
4,7,6,3
答案 0 :(得分:3)
您正在尝试使用CASE的THEN来改变变量的值。不是这样的。然而,这可行,并且看起来更接近您可能想要实现的目标:
DECLARE @total INT
SET @total = 0
SELECT
s1.RowCountID,
CASE
WHEN s1.dayTotal < s2.dayTotal THEN @total
WHEN s1.dayTotal > s2.dayTotal THEN (s1.dayTotal - s2.dayTotal)
END AS res,
s1.dayTotal,
s2.dayTotal
FROM simple_summary s1
JOIN simple_summary s2 ON s2.RowCountID = s1.RowCountID - 1
ORDER BY s1.RowCountID ASC
PS - 您的CASE不考虑s1.dayTotal = s2.dayTotal的可能性。不确定没关系。
PPS - 如果您希望第二个WHEN
总计总和与差异,请使用
WHEN s1.dayTotal > s2.dayTotal THEN @total+(s1.dayTotal - s2.dayTotal)
PPPS - 这似乎产生了所需的结果集:
select a.RowCountID, case when b.diff > 0 then a.res+b.diff else a.res end as res, a.daytotal1, a.daytotal2 from
(
SELECT
s1.RowCountID,
CASE
WHEN s1.dayTotal < s2.dayTotal THEN s2.dayTotal
WHEN s1.dayTotal >= s2.dayTotal THEN s1.dayTotal
END AS res,
s1.dayTotal as dayTotal1,
s2.dayTotal as dayTotal2,
s2.dayTotal - s1.dayTotal as diff
FROM simple_summary s1
JOIN simple_summary s2 ON s2.RowCountID = s1.RowCountID - 1
) a
left join
(
SELECT
s1.RowCountID,
CASE
WHEN s1.dayTotal < s2.dayTotal THEN s2.dayTotal
WHEN s1.dayTotal >= s2.dayTotal THEN s1.dayTotal
END AS res,
s1.dayTotal as dayTotal1,
s2.dayTotal as dayTotal2,
s2.dayTotal - s1.dayTotal as diff
FROM simple_summary s1
JOIN simple_summary s2 ON s2.RowCountID = s1.RowCountID - 1
) b on a.rowcountID = b.rowcountID+1
order by a.rowcountID
不确定这种自加入查询的名称是什么,但它应该有一个名称:)
希望它运作良好!
答案 1 :(得分:1)
您需要删除&#34; @total =
&#34;来自case
声明。
DECLARE @total int
SET @total = 0
SELECT
s1.RowCountID,
CASE
WHEN s1.dayTotal < s2.dayTotal THEN @total
WHEN s1.dayTotal > s2.dayTotal THEN @total + (s1.dayTotal - s2.dayTotal)
END AS res,
s1.dayTotal,
s2.dayTotal
FROM simple_summary s1
JOIN simple_summary s2
ON s2.RowCountID = (s1.RowCountID - 1)
ORDER BY s1.RowCountID ASC
答案 2 :(得分:0)
在进一步调查(并找到how to get cumulative sum)之后确定,以下是使其正常工作的正确代码(但添加了case命令):
SELECT
s1.RowCountID,
SUM(
CASE
WHEN s1.dayTotal < s2.dayTotal THEN 0
WHEN s1.dayTotal > s2.dayTotal THEN s1.dayTotal - s2.dayTotal
END) OVER(
ORDER BY s1.RowCountID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS res2,
s1.dayTotal,
s2.dayTotal
FROM simple_summary s1
JOIN simple_summary s2 ON s2.RowCountID = s1.RowCountID - 1
ORDER BY s1.RowCountID ASC
我的实际问题是我也使用MySQL(我正在试验看其他地方是否可能)所以接下来的问题是MySQL的外观如何?这需要进一步调查!!