代码之家  ›  专栏  ›  技术社区  ›  pro_data

如何在SQL Server中按顺序显示月份?

  •  1
  • pro_data  · 技术社区  · 2 年前

    下面是我创建并在其中插入值的表格:

    CREATE TABLE employees_list   
    (employeeID int identity(1,1),   
    employeeName varchar(25))  
    GO   
      
    INSERT INTO employees_list VALUES ('Kevin'),('Charles')  
    GO   
       
    CREATE TABLE hourlyRates   
    (employeeID int,   
    rate int,   
    rateDate date)   
      
    INSERT INTO hourlyRates VALUES (1, 28, '2016-01-01'),   
                                   (1, 39, '2016-02-01'),  
                                   (2, 43, '2016-01-01'),  
                                   (2, 57, '2016-02-01')  
      
      
    CREATE TABLE workingHours   
    (employeeID int,   
    startdate datetime,   
    enddate datetime)  
    GO   
      
    INSERT INTO workingHours VALUES (1, '2016-01-01 09:00', '2016-01-01 17:00'),  
                                    (1, '2016-01-02 09:00', '2016-01-02 17:00'),  
                                    (1, '2016-02-01 10:00', '2016-02-01 16:00'),  
                                    (1, '2016-02-02 11:00', '2016-02-02 13:00'),  
                                    (2, '2016-01-01 10:00', '2016-01-01 16:00'),  
                                    (2, '2016-01-02 08:00', '2016-01-02 14:00'),  
                                    (2, '2016-02-01 14:00', '2016-02-01 19:00'),  
                                    (2, '2016-02-02 13:00', '2016-02-02 16:00')  
    GO
    
    SELECT * FROM employees_list
    SELECT * FROM hourlyRates
    SELECT * FROM workingHours
    

    然后我运行了一个查询来计算每月支付给员工的工资:

    SELECT employeeName,DATENAME(MONTH,startdate) AS 'Month',
    SUM(DATEDIFF(HOUR,startdate,enddate) * rate) AS 'Total Salary'
    FROM hourlyRates,workingHours,employees_list
    WHERE hourlyRates.employeeID = workingHours.employeeID
    AND employees_list.employeeID = workingHours.employeeID
    AND 
    (hourlyRates.rateDate
     BETWEEN DATEFROMPARTS(DATEPART(YEAR, workingHours.startDate), DATEPART(MONTH,workingHours.startDate),1) 
     AND DATEFROMPARTS(DATEPART(YEAR, workingHours.endDate), DATEPART(MONTH,workingHours.endDate),1))
     GROUP BY employeeName,DATENAME(MONTH,startdate)
    

    我得到了以下结果:

    enter image description here

    从上面的截图可以看出,我得到了我想要的结果。 但唯一的问题是,月份没有按顺序显示。

    我试着加上 按日期名称排序的订单(月、开始日期) 但是月份的顺序仍然没有被排序。 我甚至试过 按日期部分订购(MM,起始日期) 但它显示了一个错误,即它不包含在聚合函数或GROUP BY子句中。

    我需要在我的查询中做什么小的更改?

    1 回复  |  直到 2 年前
        1
  •  2
  •   D-Shih    2 年前

    为什么要加 ORDER BY DATENAME(MONTH,startdate) 不行

    因为 ORDER 取决于字符,而不是数字的月份。

    你可以尝试添加 MONTH(startdate) 在里面 ORDER BY & GROUP BY ,因为您可能需要在中添加非聚合函数 分组

    SELECT employeeName,DATENAME(MONTH,startdate) AS 'Month',
           SUM(DATEDIFF(HOUR,startdate,enddate) * rate) AS 'Total Salary'
    FROM hourlyRates
    INNER JOIN workingHours
    ON  hourlyRates.employeeID = workingHours.employeeID
    INNER JOIN employees_list
    ON employees_list.employeeID = workingHours.employeeID
    WHERE
    (hourlyRates.rateDate
     BETWEEN DATEFROMPARTS(DATEPART(YEAR, workingHours.startDate), DATEPART(MONTH,workingHours.startDate),1) 
     AND DATEFROMPARTS(DATEPART(YEAR, workingHours.endDate), DATEPART(MONTH,workingHours.endDate),1))
    GROUP BY employeeName,DATENAME(MONTH,startdate),MONTH(startdate)
    ORDER BY MONTH(startdate)
    

    sqlfiddle

    笔记

    我会用 INNER JOIN ANSI语法,而不是 , 这意味着 CROSS JOIN 因为 JOIN 语法通常被认为更具可读性。