【问题标题】:Case statement order by - invalid column name 'yearmonth'案例陈述顺序 - 无效的列名“年月”
【发布时间】:2021-02-25 07:38:41
【问题描述】:

当我使用 case 语句时,我的查询无法识别该列,但在我不使用的情况下却可以。我真的需要使用case语句。你能告诉我为什么它是错的。非常感谢。

我会更新我正在尝试做的事情,谢谢

【问题讨论】:

  • then 10 en 'Nov2020' ...
  • 顺便说一句,这是case 表达式,而不是语句。
  • 你不能简单地ORDER BY SRVC_DT 代替吗?
  • 您的计算列在月份和年份之间总是有一个破折号 (-),因此您的 case 表达式中的常量除了第一个之外都是不正确的。你把你的逻辑复杂化了。并且在你的 datediff 函数中使用“mm”确实为你节省了很多精力,以至于你不使用“month”——它更具可读性和更容易理解。
  • 好的,明白了,谢谢

标签: sql sql-server sql-order-by case


【解决方案1】:

SQL Server 无法识别位于表达式中的列别名。伤心。

但是有一个更简单的方法:

order by min(SRVC_DT)

这只是按每个组中SRVC_DT 的最小值排序。

【讨论】:

  • 非常感谢!非常感谢,非常感谢大家的帮助和建议。
  • @Frederica 。 . .我很惊讶你没有接受这个答案。这是迄今为止最简单的。
  • 唯一的原因,我是新手。我希望我能给出两点,,,不想冒犯
  • 我真的很尊重这个网站..需要更多地了解重点情况..不想被禁止或类似的事情。
【解决方案2】:

您应该使用您的表列名称,而不是使用它的yearmonth ALIAS NAME

别名仅用于临时重命名表或列。

SELECT (LEFT(DATENAME(MONTH,SRVC_DT),3)  + '-'  + CAST(YEAR(SRVC_DT) AS NCHAR)) AS YEARMONTH
FROM  IRX_MAIN.ESA.VW_CLM_PHRMCY_DLY_MSTR
WHERE DATEDIFF(MM, SRVC_DT, GETDATE()) BETWEEN 1 AND 12
ORDER BY (CASE (LEFT(DATENAME(MONTH,SRVC_DT),3)  + '-'  + CAST(YEAR(SRVC_DT) AS NCHAR)) WHEN 'JUL-2020'  THEN 7 
                                                                        WHEN 'AUG2020' THEN 8 
                                                                        WHEN 'SEP2020' THEN 9 
                                                                        WHEN 'OCT2020' THEN 10 
                                                                        WHEN 'NOV2020' THEN 11  
                                                                        WHEN 'DEC2020' THEN 12 END)

另外,你可以试试这个:

SELECT (LEFT(DATENAME(MONTH,SRVC_DT),3)  + '-'  + CAST(YEAR(SRVC_DT) AS NCHAR)) AS YEARMONTH
FROM  IRX_MAIN.ESA.VW_CLM_PHRMCY_DLY_MSTR
WHERE DATEDIFF(MM, SRVC_DT, GETDATE()) BETWEEN 1 AND 12
ORDER BY SRVC_DT 

【讨论】:

  • 非常感谢..实际上它会在一个联合中,有时它的 srvc_dt 有时它的 elig 日期......我只是一次测试一个......谢谢你应该是什么时候而不是'zh'
  • (select (LEFT(datename(Month,SRVC_DT),3) + '-' + cast(year(SRVC_DT) as nchar)) as yearmonth from IRX_MAIN.tsa.VW_CLM_PHRMCY where datediff(mm, SRVC_DT, getdate()) 在 1 和 12 之间联合选择 (LEFT(datename(Month,SRVC_DT),3) + '-' + cast(year(SRVC_DT) as nchar)) as yearmonth from IRX_MAIN.tsa.vw_ELIG_PHRMCY where datediff( mm, elig_DT, getdate()) 在 1 到 12 之间)按大小写排序....
  • 我还更正了我的查询中何时而不是“en”。 -- @弗雷德里卡
  • 当它不总是 srvc_dt,但有时是 elig_dt 时,你能告诉我如何处理它吗?
  • 请把案子解释清楚 - @Frederica
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2010-10-30
  • 2016-05-13
  • 2016-02-21
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
相关资源
最近更新 更多