【问题标题】:SQL Grouping by Month on dates fieldsSQL 按日期字段按月分组
【发布时间】:2015-11-18 06:12:10
【问题描述】:

我需要员工收入的总和,但分为两个日期之间的月份,但是我有一个日期字段,并且希望将月份和年份的名称作为两个单独的字段。

此查询显示未分组的信息 - 减去所需格式的年份和月份。

一旦我获得了员工当月的收入,我需要按姓名(已经完成)和每个员工的月份年份对其进行排序

SELECT   Employee.Name      
, Employee.ID       
, Sales.Date         
, Sales.Money            
FROM Database.Sales.Sales       
INNER JOIN Database.Employee.Employee        
ON Sales.ID=Employee.ID        
WHERE Sales.Date BETWEEN '2000-01-01' AND '2001-01-01'            
ORDER BY Employee.Name   

谢谢

【问题讨论】:

  • 我应该补充一下,我需要月份的名称而不是整数

标签: mysql sql sql-server tsql date


【解决方案1】:

这是一个查询:

SELECT   Employee.Name      
, Employee.ID       
, Sum(Sales.Money)
, Year(Sales.Date)           
, Month(Sales.Date)
FROM Database.Sales.Sales       
INNER JOIN Database.Employee.Employee        
ON Sales.ID=Employee.ID        
WHERE Sales.Date BETWEEN '2000-01-01' AND '2001-01-01'            
group by 
    Employee.Name      
    , Employee.ID
    , Year(Sales.Date)           
    , Month(Sales.Date)
ORDER BY Employee.Name,  Year(Sales.Date), Month(Sales.Date)

【讨论】:

  • 原始的Sales.Date会因为年月分组而丢失
  • 另外,正如在另一个人的帖子中所指出的那样,您将获得更好的性能,将日期转换函数在选择字段中生成别名,然后对这些别名进行分组,而不是为每个字段调用两次日期函数。 (或您下单时的三倍)
  • 如果算法的性能度量不是 n 的平方,它不会有害。 2n 或 3n 是线性的,n 的平方是指数的。
  • 得到这个工作 - 而不是将月份作为整数,你将如何让它显示月份的名称?
  • 你可以使用这个函数:DateName(month, Sales.Date)。但是您应该将此字段添加到 select 和 group by 子句中。
【解决方案2】:

您可以使用 Month()Year 函数并进行分组。将这样的内容合并到您的查询中:

SELECT Employee.Name, 
       Employee.ID, 
       MONTH(Sales.Date) as `month`, 
       YEAR(Sales.Date) as    `year`,
       SUM(Sales.Money)       
 FROM Database.Sales.Sales        
   INNER JOIN Database.Employee.Employee ON Sales.ID=Employee.ID        
 WHERE Sales.Date BETWEEN '2000-01-01' AND '2001-01-01'  
   GROUP by Employee.Name , Employee.ID, `month` , `year`        
 ORDER BY Employee.Name   

【讨论】:

    【解决方案3】:

    日期分成 2 个字段

    SELECT   Employee.Name      
        , Employee.ID       
        , YEAR(Sales.Date) as sales_year
        , MONTH(Sales.Date) as sales_month
        , Sales.Money            
        FROM Database.Sales.Sales       
        INNER JOIN Database.Employee.Employee        
        ON Sales.ID=Employee.ID        
        WHERE Sales.Date BETWEEN '2000-01-01' AND '2001-01-01'            
        ORDER BY Employee.Name  
    

    【讨论】:

      【解决方案4】:

      试试这个方法

      SELECT   Employee.Name      
      , Employee.ID       
      , Datepart(year,sales.Date),Datepart(month,sales.Date)        
      , sum(Sales.Money)
      FROM Database.Sales.Sales       
      INNER JOIN Database.Employee.Employee        
      ON Sales.ID=Employee.ID        
      WHERE Sales.Date BETWEEN '2000-01-01' AND '2001-01-01' 
      Group by Datepart(year,sales.Date),Datepart(month,sales.Date),Employee.Name,Employee.id           
      ORDER BY Employee.Name  
      

      【讨论】:

      • 您将获得更好的性能别名选择列表中的日期函数结果,然后对这些结果进行分组,而不是为每个字段调用两次日期函数
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多