表T的子集,它也是期望的输出,当ExtID =24时:
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表达式?
发布于 2016-09-29 20:58:40
此方法为每个日期选择最小的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发布于 2016-09-29 18:19:25
为此,您可以使用一个窗口函数:
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排序时,THis将计数此日期中有多少出现在此记录之前。如果它是0,那么我们是在第一个记录,所以测试您的开斋节和坚持70在那里(可能现在可以删除EID的测试,但为了防止它是必要的)。
https://stackoverflow.com/questions/39777239
复制相似问题