【问题标题】:Dealing with Dates and Summing up Rows处理日期和汇总行
【发布时间】:2014-06-18 13:52:26
【问题描述】:

我希望生成的表格与我提供的示例表格一样,即使提供的唯一月份是 5,我希望表格显示所有 12 个月,即使其他月份的金额为 0。

我正在使用这个查询,让我试着解释一下我想要的金额。我希望金额列包含相应月份的每笔销售额的总和。

Select   
    YEAR([Date]) as [Year],
    MONTH([Date]) as [Month],
    IsNull(SUM(Amount), 0) AS TotalSales
From Sales Left Outer Join Employee
On Employee.EmployeeID = Sales.EmployeeID
    Group By YEAR([Date]), MONTH([Date])
    Order By YEAR([Date]), MONTH([Date])

员工表,

+--+--+------+
|ID|  Name   |
+--+---------+
|1 |John Doe |
+--+---------+
|2 |Jane Doe |
+--+---------+

销售表,

+--+------+---------+-------+--------+
|ID|SaleID| Date    |Amount |Quantity|
+--+------+---------+-------+--------+
|1 |  1   |5-14-2014|300    |12      |
+--+------+---------+-------+--------+
|1 |  2   |5-16-2014|600    |4       |
+--+------+---------+-------+--------+
|2 |  3   |5-14-2014|452    |10      |
+--+------+---------+-------+--------+
|2 |  4   |5-16-2014|356    |2       |
+--+------+---------+-------+--------+

我想要什么,

+--+---------+-----+------+--------+--------+
|ID|  Name   |Year |Month |Amount  |Quantity|
+--+---------+-----+------+--------+--------+
|1 |John Doe |2014 |5     |900     |16      |
+--+---------+-----+------+--------+--------+
|2 |Jane Doe |2014 |5     |808     |12      |
+--+---------+-----+------+--------+--------+

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    试试这个

    Select S.ID,E.Name,YEAR(MAX([Date])) as [Year],MONTH(MAX([Date])) as [Month],
          IsNull(SUM(Amount), 0) AS TotalSales,IsNull(SUM(Quantity), 0) AS TotalQuantity
    From Sales S Left Join Employee E On E.ID = S.ID
    Group By S.ID,E.Name,YEAR([Date]), MONTH([Date])
    Order By S.ID
    

    FIDDLE DEMO

    输出:


    +--+---------+-----+------+--------+--------+
    |ID|  Name   |Year |Month |Amount  |Quantity|
    +--+---------+-----+------+--------+--------+
    |1 |John Doe |2014 |5     |900     |16      |
    +--+---------+-----+------+--------+--------+
    |2 |Jane Doe |2014 |5     |808     |12      |
    +--+---------+-----+------+--------+--------+
    

    更新

    如果您想显示月份 (1-12),即使该月份的金额为 0

    试试这个

    ;With Months (Month,MonthID) 
    AS
    (
    
        select 'January' as Month , 1 as MonthID
        UNION
        select 'February' as Month , 2 as MonthID
        UNION
        select 'March' as Month , 3 as MonthID
        UNION
        select 'April' as Month , 4 as MonthID
        UNION
        select 'May' as Month , 5 as MonthID
        UNION
        select 'June' as Month , 6 as MonthID
        UNION
        select 'July' as Month , 7 as MonthID
        UNION
        select 'August' as Month , 8 as MonthID
        UNION
        select 'September' as Month , 9 as MonthID
        UNION
        select 'October' as Month , 10 as MonthID
        UNION
        select 'November' as Month , 11 as MonthID
        UNION
        select 'December' as Month , 12 as MonthID
    
    )
    
    SELECT R.ID,R.Name,R.[Year],M.[MonthID],M.[Month],R.TotalSales,R.TotalQUANTITY FROM
    Months M LEFT JOIN
    (
    Select S.ID,E.Name,YEAR([Date]) as [Year],MONTH([Date]) as [Month],
          IsNull(SUM(Amount), 0) AS TotalSales,IsNull(SUM(Quantity), 0) AS TotalQuantity
    From Sales S Left Join Employee E On E.ID = S.ID
    Left OUTER JOIN Months ON MonthID = MONTH([Date])
    Group By S.ID,E.Name,YEAR([Date]), MONTH([Date])
    ) R ON R.Month = M.MonthID
    Order By CASE WHEN R.ID IS NULL THEN 1 ELSE 0 End,R.ID,M.MonthID
    

    FIDDLE DEMO

    【讨论】:

    • 似乎有效 :) 但关于我的其他请求,我希望结果显示所有月份,即使它们没有被列为销售日。
    • 您能否编辑您的问题并提供示例输出@Prosperity
    • 与您的输出基本相同,但在月份列中它会显示月份 (1-12),即使该月份的金额为 0
    • @Prosperity 我已经更新了答案请检查并告诉我
    • 这是我想要的,但它会为每个员工显示 1 - 12
    【解决方案2】:
    SELECT e.ID,
           e.Name,
           YEAR(s.date)AS Year,
           MONTH(s.date)AS Month,
           sum(s.amount) AS Amount,
           sum(s.quantity) AS Quantity
    FROM Employee e
    LEFT JOIN Sales s ON e.id=s.id
    GROUP BY e.ID,e.Name,year(s.date),month(s.date)
    

    【讨论】:

    • 我已经尝试过了,但它给了我一个错误,因为 e.id 和 e.name 需要是聚合函数或 Group by
    • 您遇到的错误请在此处提及,以便我为您提供帮助
    • @Sadikhasan 你必须在Group by 子句中包含e.name
    • @Prosperity 检查我的更新答案,现在它工作正常
    【解决方案3】:

    试试这个!

    select ID,Name,yaer,monht,Amount,quantity from
    (
    select distinct Year(Date1) as yaer,Month(Date1) as monht,rn=ROW_NUMBER()over(order by Year(Date1)) from #emp
    )x,
    (
    select a.ID,a.Name,sum(b.Amount) as Amount,sum(b.Quantity) as quantity,rn1=row_number()over(order by a.ID) from #sales a join #emp b on a.ID=b.ID
    group by a.ID,a.Name
    )y
    where x.rn=y.rn1
    

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多