【问题标题】:Join and aggregate on two columns - for every month even months with no data?加入并聚合两列 - 每个月甚至几个月没有数据?
【发布时间】:2012-10-17 22:36:59
【问题描述】:

使用 SQL Server 2005。

我有一张包含日历月份的表格

Month,  fiscalorder
june,1
july,2
..
may,12

还有一张有员工的桌子和每月重复的金额

employee, month, amount
john, july, 10
john, july, 3
john, august,2
mary, june, 2
mary, feb, 5

我需要按月加入和汇总这些数据,但每个月(甚至没有数据的月份)都要为每个员工报告,然后是员工的财务订单。

输出:

june, john, 0
july, john, 13
august,john,2
sept, john, 0
..
june,mary,2

【问题讨论】:

    标签: tsql join aggregate monthcalendar


    【解决方案1】:

    假设 Sql Server 2005+

    Declare @CalenderMonths Table ([Month] Varchar(20),FiscalOrder Int)
    
    Insert Into @CalenderMonths Values
    ('June',1),('July',2),('August',3),('September',4),('October',5),('November',6),
    ('December',7),('January',8),('February',9),('March',10),('April',11),('May', 12)
    
    Declare @Employee Table(employee varchar(50), [month] Varchar(20), amount int )
    Insert Into @Employee Values('john', 'July', 10),('john', 'July',3),('john','August',2),('mary','June',2),('mary', 'February',5)
    
    ;with cte as
    (
        Select employee,[month],TotalAmount = sum(amount)
        from @Employee
        group by employee,[month]
    )
    
    select x.[Month],x.employee,amount = coalesce(c.TotalAmount,0)
    from (
    select distinct c.[Month],e.employee
    from @CalenderMonths c cross join cte e)x
    left join cte c on x.[Month] = c.[Month] and x.employee = c.employee
    order by 2
    

    【讨论】:

      【解决方案2】:
      SELECT month,employee,SUM(amount) amount
      FROM(
        SELECT m.month, e.employee, ISNULL(s.amount, 0) AS amount
        FROM dbo.months AS m
        CROSS JOIN (SELECT DISTINCT employee FROM dbo.sales) AS e
        LEFT JOIN dbo.sales AS s
        ON s.employee = e.employee
        AND m.month = s.month
      )X
      GROUP BY month, employee
      

      【讨论】:

      • 这不是聚合是吗?
      • 不,不是。不知何故错过了这个要求。更新了上面的代码以包含此要求。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多