首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CASE语句中,每个日期只选择一次值。

在CASE语句中,每个日期只选择一次值。
EN

Stack Overflow用户
提问于 2016-09-29 18:12:04
回答 2查看 94关注 0票数 1

表T的子集,它也是期望的输出,当ExtID =24时:

代码语言:javascript
复制
   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次。

查询:

代码语言:javascript
复制
SELECT 
     CID
    ,SDate
    ,CASE WHEN ExtID = 24 THEN 70 END        
FROM Table T

这显然会给我带来70英镑的全部费用。如何修改CASE表达式?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-29 20:58:40

此方法为每个日期选择最小的CID,并为该记录分配70的成本。对于所有具有相同日期但CID较高的其他记录,0作为成本分配。

代码语言:javascript
复制
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

在这里测试:http://sqlfiddle.com/#!9/72a221/11

票数 1
EN

Stack Overflow用户

发布于 2016-09-29 18:19:25

为此,您可以使用一个窗口函数:

代码语言:javascript
复制
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的测试,但为了防止它是必要的)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39777239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档