当ExtID = 24时,表T的子集,也是期望输出:
CID SDate Cost
1 9/9/2016 70
1 9/14/2016 0
1 9/16/2016 70
2 9/9/2016 0
2 9/14/2016 70
2 9/16/2016 0
我希望费用是按日期计算的,即当ExtID = 24时,给定日期的任何CID的费用必须为70,但剩余的费用应该为该给定日期的0。对于给定的日期,金额只能是70次。
查询:
SELECT
CID
,SDate
,CASE WHEN ExtID = 24 THEN 70 END
FROM Table T
这显然会给我带来所有费用70.如何修改CASE
表达式?
答案 0 :(得分:1)
这个选择每个日期的最小CID,并为该记录分配70的成本。对于具有相同日期但具有更高CID的所有其他记录,将0指定为成本。
SELECT DISTINCT t.cid, t.sdate,
CASE WHEN t.cid = sub.cidmin THEN 70
ELSE 0 END AS cost
FROM t
LEFT JOIN
(SELECT sdate, MIN(cid) as cidmin
FROM t
GROUP BY sdate) sub
ON t.cid = sub.cidmin
AND t.sdate = sub.sdate
答案 1 :(得分:0)
您可以使用窗口功能:
SELECT
CID
,SDate
,CASE WHEN COUNT(*) OVER (PARTITION BY DATE ORDER BY CID ASCENDING ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) = 0 AND EID = 24 THEN 70 END
FROM Table T
根据CID排序,这个日期会显示在此记录之前的多少。如果它是0那么我们就在第一个记录,所以测试你的EID并在那里坚持70(可能现在可以删除EID的测试,但是如果需要的话就把它留下来)。