【问题标题】:Unable to use multiple switch case - SQL无法使用多个开关案例 - SQL
【发布时间】:2021-06-04 09:29:13
【问题描述】:

我有这样的数据:

如果将销售额与阈值进行比较,我需要为每个项目获取并决定“已实现”或“未实现”。如果未达到达到阈值还剩多少天。

SELECT
    ID,
    ItemDate,
    DATEADD(dd, -(DAY(DATEADD(mm, 1, ItemDate))), 
               DATEADD(mm,1,ItemDate)) DateEndOfMonth,
    DATEDIFF(d, ItemDate, DATEADD(dd, -(DAY(DATEADD(mm, 1, ItemDate))), 
    DATEADD(mm, 1, ItemDate))) AS DaysRemainingm,
    ItemSales,  
    Logical_opr = CASE Opr   
                     WHEN 'less than' THEN '<'  
                     WHEN 'greater than' THEN '>'  
                     ELSE ''  
                  END,
    Threshold  
FROM
    itemData

这是我正在玩弄的小提琴——>link here

我被困在这里了。请建议我如何实现我的目标

【问题讨论】:

  • 嗨,梅赫迪!一个快速的问题:您想如何计算达到阈值的剩余天数?
  • @ACC 假设日期是 2020-07-29 并且销售额是 20.. 但该月的阈值是 50。所以该月的结束日期是 2020-07-31.. 所以如果我从日期和计算的结束日期做差异,我还有 2 天的时间来实现 30(即 50-20 )销售。
  • 使用searched CASE expression,如case when opr = 'less than' and sales &lt;= threshold then 'achieved'...
  • 你在写DATEADD(ddDATEADD(day 时“节省”了多少精力?哪个更具可读性?你可以通过同时使用“d”和“dd”来表示“day”来增加难度。
  • @SM我还是新手...下次我会记住的

标签: sql sql-server database


【解决方案1】:

您的工作查询列似乎与您对需求的描述不符,但是以下内容对您有用吗?

with t as (
    select *, 
    case when opr='less than' then 
        case when itemsales < threshold then 'Not a' else 'A' end
    else
        case when itemsales < threshold then 'Not a' else 'A' end
    end + 'chieved' Result,
    DateDiff(day,itemdate,EOMonth(itemdate)) Remaining
    from itemData
)
select Id, Itemdate, ItemSales, Threshold, Result, 
    case Result when 'Achieved' then 0 else Remaining end Remaining
from t

Fiddle

【讨论】:

  • 谢谢@Stu,是的。但为了实现我不想剩下的日子。它可以是“0”来实现
  • @mehdi 我已经调整了查询​​,现在是您需要的吗?
  • 谢谢@Stu,如果我想排除周末(即周六和周日)
  • @mehdi 我是否检测到一些球门柱追逐,这不是你的问题。您可以添加 `where datename(weekday, itemdate) not in ('saturday','sunday')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
相关资源
最近更新 更多