【问题标题】:Mysql Rollup with multiple group具有多个组的Mysql汇总
【发布时间】:2018-02-28 03:50:33
【问题描述】:

ID 为自动递增客户、日期和金额的 Mytable 我想做一个汇总,汇总每个客户每天的数量 我的意思是汇总按日期和客户分组 我的结果应该是这样的:

+---------+--------------+--------------+------------+
| Id      | Date         | Customer     |     Amount |  
+---------+--------------+--------------+------------+
| 1       | 2017-09-19   |          B   |        10  | 
| 4       | 2017-09-19   |          B   |        15  | 
| 8       | 2017-09-19   |          B   |        02  | 
| 6       | 2017-09-19   |          B   |        18  |
| 5       | 2017-09-19   |          B   |        05  | 
| Total   | NULL         |          B   |        50  | 

| 9       | 2017-09-19   |         C    |        11  | 
|14       | 2017-09-19   |         C    |        10  |
| 12      | 2017-09-19   |         C    |        09  | 
| Total   | NULL         |         C    |        30  | 

| 11       | 2017-09-18  |         B    |         20 | 
| 15       | 2017-09-18  |         B    |         40 |
| Total    | NULL        |         B    |         60 | 

| 10       | 2017-09-18  |         A    |         1  | 
| 13       | 2017-09-18  |         A    |         1  | 
| 16       | 2017-09-18  |         A    |         1  | 
| 7        | 2017-09-18  |         A    |         1  |
| 3        | 2017-09-18  |         A    |         1  | 
| Total    | NULL        |         A    |         5  | 

| 2        | 2017-09-18   |         C   |        90  | 
| Total    | NULL         |         C   |        90  | 

我试过了:

Select
Mytable.Id,
Mytable. Date,
Mytable.Customer,
Mytable.Amount
From Mytable
GROUP BY Mytable. Date, Mytable.Customer WITH ROLLUP

但这并没有按预期工作。请帮助

【问题讨论】:

  • 您的查询无效,因为IdAmount 不是您的聚合的一部分。

标签: mysql sql group-by rollup


【解决方案1】:

您需要一个聚合。这符合您的要求吗?

select t.Date, t.Customer,
       sum(t.Amount) as Amount
from Mytable t
group by t.Date, t.Customer with rollup;

如果你真的想要id,那么:

select t.id, t.Date, t.Customer,
       sum(t.Amount) as Amount
from Mytable t
group by t.id, t.Date, t.Customer with rollup;

【讨论】:

  • 感谢@Gordon Linoff,但我尝试了您的查询,但它不能作为我在上表中的结果
【解决方案2】:

我认为以下查询将解决您的问题。

SELECT IF(temp.date IS NULL, 'Total', temp.Id), temp.Date, temp.Customer, temp.Amount
FROM
     (Select group_concat(Mytable.Id),
             Mytable.Date,
             Mytable.Customer,
             SUM(Mytable.Amount)
      From Mytable
      GROUP BY Mytable. Date, Mytable.Customer WITH ROLLUP)) AS temp

【讨论】:

  • 我能知道版本吗?
  • 因此,您必须启用标准 SQL 行为。让我知道您遇到了错误,或者它没有提供您预期的输出。
  • 我按照你说的使用了。我没有在 select 子句中使用 id。
  • 你的格式让我很难看到。我编辑了你的答案
  • 谢谢。我创建了一个临时表来显示“总计”。我认为它会给出预期的输出。
【解决方案3】:

您需要在group by 上添加id

对于版本

查询:

select 
    coalesce(id, 'Total') as id,
    date,
    customer,
    sum(amount) as amount
from
    mytable
group by date, customer, id with ROLLUP
having customer is not null;

结果:

编号 |日期 |客户 |数量 :---- | :--------- | :------- | -----: 3 | 2017-09-18 |一个 | 1 7 | 2017-09-18 |一个 | 1 10 | 2017-09-18 |一个 | 1 13 | 2017-09-18 |一个 | 1 16 | 2017-09-18 |一个 | 1 总计 | 2017-09-18 |一个 | 5 11 | 2017-09-18 |乙| 20 15 | 2017-09-18 |乙| 40 总计 | 2017-09-18 |乙| 60 2 | 2017-09-18 | C | 90 总计 | 2017-09-18 | C | 90 1 | 2017-09-19 |乙| 10 4 | 2017-09-19 |乙| 15 5 | 2017-09-19 |乙| 5 6 | 2017-09-19 |乙| 18 8 | 2017-09-19 |乙| 2 总计 | 2017-09-19 |乙| 50 9 | 2017-09-19 | C | 11 12 | 2017-09-19 | C | 9 14 | 2017-09-19 | C | 10 总计 | 2017-09-19 | C | 30

对于版本 > 5.7

查询:

select 
    coalesce(id, 'Total') as id,
    date,
    customer,
    sum(amount) as amount
from
    mytable
group by date, customer, id with ROLLUP
having grouping(customer) = 0;

结果:

编号 |日期 |客户 |数量 :---- | :--------- | :------- | -----: 3 | 2017-09-18 |一个 | 1 7 | 2017-09-18 |一个 | 1 10 | 2017-09-18 |一个 | 1 13 | 2017-09-18 |一个 | 1 16 | 2017-09-18 |一个 | 1 总计 | 2017-09-18 |一个 | 5 11 | 2017-09-18 |乙| 20 15 | 2017-09-18 |乙| 40 总计 | 2017-09-18 |乙| 60 2 | 2017-09-18 | C | 90 总计 | 2017-09-18 | C | 90 1 | 2017-09-19 |乙| 10 4 | 2017-09-19 |乙| 15 5 | 2017-09-19 |乙| 5 6 | 2017-09-19 |乙| 18 8 | 2017-09-19 |乙| 2 总计 | 2017-09-19 |乙| 50 9 | 2017-09-19 | C | 11 12 | 2017-09-19 | C | 9 14 | 2017-09-19 | C | 10 总计 | 2017-09-19 | C | 30

小提琴:
dbfiddle here

注意:在没有ERROR 1055的情况下使用group by时,您需要设置为

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 2011-10-05
    • 1970-01-01
    • 2017-07-28
    • 2021-09-27
    相关资源
    最近更新 更多