【问题标题】:How to Separate Months by Their Years in SQL如何在 SQL 中按年份分隔月份
【发布时间】:2020-11-11 17:32:38
【问题描述】:

我试图在 SQL 中查看每个月的利润。但是,我有多个“七月”,似乎无法将它们分成不同的年份。这是我正在尝试的查询。

select 
    concat(datename(year, o.orderdate), ' ', datename(month, o.OrderDate)) [Month], 
    sum((t.StandardPrice - t.TotMaterialCost) * ol.OrderedQuantity) [Total Profit]
from 
    Temp_V t, OrderLine_T ol, Order_T o
where 
    t.ProductID = ol.ProductID 
    and ol.OrderID = o.OrderID
group by 
    o.OrderDate

我得到了正确的输出,但例如,它在两个不同的行中显示 2017 年 7 月,而不是 2017 年 7 月和 2018 年 7 月。(这就是我想说的)。我认为这是Concat() 的错误。

【问题讨论】:

标签: sql sql-server datetime concatenation


【解决方案1】:

我相信你想要EOMONTH()的这种用法:

SELECT EOMONTH(o.orderDate) month_ending,
       sum(<whatever>) [Total Profit]
  FROM <whatever>
 GROUP BY  EOMONTH(o.orderDate) 

EOMONTH 函数采用任何日期或日期/时间值并将其截断到该月最后一天的开始。因此,这是一种理想的方法,可以将一大堆 orderDate 值分组到它们发生的月份中。

【讨论】:

  • 直到现在我才知道 EOMONTH 的存在。看完之后,惊讶地发现它从 sql 2012 就已经存在了,我没有遇到它。我一直在使用自己的用户定义函数进行此类操作。很高兴我今天访问了 SO。
  • 是的。我会每隔几个月检查一次我正在使用的 DBMS 的日期/时间函数。我花在它上面的每一秒都是值得的。更少的错误,更清晰的代码。让拥有大量测试人员的大公司担心日历、时区、日期翻转以及所有这些事情。他们比我好!
  • 从现在开始这也将成为我的新习惯。如果您能分享一些关于您这样做的方法的见解或一些根据新标准(w3school 除外)更新的有用链接,将不胜感激。将无法在 cmets 此处发布回复以避免垃圾邮件,因此提前感谢您。哦,是的,学习很有趣……
【解决方案2】:

我相信您缺少的是正确的“分组依据”子句,应该是:

group by concat(datename(year, o.orderdate), datename(month, o.OrderDate))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多