繁体   English   中英

通过SQL生成每个客户每月的销售报告,例如按两列分组,然后将第三列求和

[英]Produce a per customer per month sales report via SQL eg group by two columns and sum the third

我很少写SQL(Azure SQL),但是我试图产生每个客户每月的销售总额。

顾客:

    |Username     |ID    |
    |user1        |1     |
    |user2        |2     |
    |user3        |3     |

订购:

    |CustomerId   |Month |Total     |
    |1            |1     |275       |
    |1            |1     |10        |
    |2            |1     |100       |
    |1            |3     |150       |
    |2            |2     |150       |
    |2            |2     |65        |
    |3            |2     |150       |

我想生产

|Username     |Month1Total |Month2Total | Month3Total |
|user1        |285         |275         |     150     |
|user2        |100         |215         |      0      |
|user3        |0           |150         |      0      |

我可以做到以下几点

SELECT customerTable.Username Username, SUM(orderTable.OrderTotal) TotalMay
FROM "Order" orderTable
JOIN Customer customerTable ON orderTable.CustomerId = customerTable.Id
WHERE DATENAME(Month, (orderTable.PaidDateUTC)) = 'May'
GROUP BY Username

这将给我每月的输出。 但是我不知道如何循环播放,每月进行一次,然后按用户名分组。

如果您希望每个月都有单独的一列,请尝试此操作

SELECT customerTable.Username Username
,SUM(iif(ordertable.[month] = 1,orderTable.OrderTotal,0)) TotalJan
,SUM(iif(ordertable.[month] = 2,orderTable.OrderTotal,0)) TotalFeb
,SUM(iif(ordertable.[month] = 3,orderTable.OrderTotal,0)) TotalMar
,SUM(iif(ordertable.[month] = 4,orderTable.OrderTotal,0)) TotalApr
,SUM(iif(ordertable.[month] = 5,orderTable.OrderTotal,0)) TotalMay

FROM "Order" orderTable
JOIN Customer customerTable ON orderTable.CustomerId = customerTable.Id

GROUP BY Username

应该容易添加剩余的月份

您可以在以下情况下使用案例

  with t1 as
   ( select o.CustomerId,o.Month, sum(Total) as total from
      [Order] 
     group by o.CustomerId,o.Month
  ) select c.Username, 
   case when t1.month=1 then t1.total else 0 end month1,
   case when t1.month=2 then t1.total else 0 end month2,
   case when t1.month=3 then t1.total else 0 end month3 
   from t1 join Customer c on t1.CustomerId=c.ID

或者您可以使用PIVOT

select c.username, t.* from
(
select * from 
(select * from ord
) src
pivot
( sum(Total) FOR Month IN ([1],[2],[3])
) pvt
) as t join Customer c on t.CustomerId=c.ID

像这样:

SELECT DATENAME(Month, (orderTable.PaidDateUTC)) MonthName, 
   customerTable.Username Username, 
   SUM(orderTable.OrderTotal) TotalMay
FROM "Order" orderTable
JOIN Customer customerTable ON orderTable.CustomerId = customerTable.Id
GROUP BY DATENAME(Month, (orderTable.PaidDateUTC)), Username

您只需要将月份名称从WHERE子句移至GROUP BY。

我只是用条件聚合来做JOIN

SELECT c.Username, 
       SUM(CASE WHEN o.Month = 1 THEN o.Total ELSE 0 END) AS [Month1Total],
       SUM(CASE WHEN o.Month = 2 THEN o.Total ELSE 0 END) AS [Month2Total],
       SUM(CASE WHEN o.Month = 3 THEN o.Total ELSE 0 END) AS [Month3Total],
       . . . 
FROM Customer C INNER JOIN
     Order o
     ON o.CustomerId = c.id
GROUP BY c.Username;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM