【问题标题】:SQL query to get the subtotal of some rowsSQL查询获取某些行的小计
【发布时间】:2017-11-28 06:14:00
【问题描述】:

如果我想获取每个经理(包括他的团队)的总项目和总收入,SQL 查询脚本会是什么?
假设我有这张表items_revenue 的列:

| id |is_manager|manager_id| name |no_of_items| revenue | | 1 | 1 | 0 | Manager1 | 621 | 833 | | 2 | 1 | 0 | Manager2 | 458 | 627 | | 3 | 1 | 0 | Manager3 | 872 | 1027 | ... | 8 | 0 | 1 | Member1 | 1258 | 1582 | | 9 | 0 | 2 | Member2 | 5340 | 8827 | | 10 | 0 | 3 | Member3 | 3259 | 5124 |

所有经理及其各自的成员都在上面的视图表中。 Member1 在 Manager1 下,Member2 在 Manager2 下,依此类推,但真实数据是随机排列的。我还有一个带有managers 的视图表,我只过滤了经理。我尝试使用以下查询获取每位团队经理的总数:
SELECT id, is_manager, manager_id, name, SUM(no_of_items) AS total_items, SUM(revenue) AS total_revenue FROM items_revenue t WHERE (SELECT m.id FROM managers m WHERE m.id = t.id) GROUP BY id HAVING id IN (SELECT m.id FROM managers m);

但是,它只返回每个经理单独的总数,它不获取其成员的总数。

我希望我的查询输出 ff。表:
| id |is_manager|manager_id| name |total_items| total_revenue | | 1 | 1 | 0 | Manager1 | 1879 | 2415 | | 2 | 1 | 0 | Manager2 | 5798 | 9454 | | 3 | 1 | 0 | Manager3 | 4131 | 6151 |

任何想法如何得到这个?任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 如果您有一个小的后续问题,请使用新数据编辑我的演示并将链接粘贴到此处。否则打开一个新问题。

标签: mysql sql sql-server categorical-data


【解决方案1】:

您可以使用CASE 表达式进行聚合,如果manager_id 为零,则使用id 形成一个组,否则使用manager_id。其余逻辑与您已有的类似。

SELECT
    CASE WHEN manager_id = 0 THEN id ELSE manager_id END AS manager_id,
    MAX(CASE WHEN is_manager=1 THEN name END) AS name,
    SUM(no_of_items) AS total_items,
    SUM(revenue) AS total_revenue
FROM items_revenue
GROUP BY
    CASE WHEN manager_id = 0 THEN id ELSE manager_id END;

Demo

附注:我在GROUP BY 子句中使用了一个函数,它不符合ANSI,因此可能无法在任何地方运行。为了解决这个问题,我们可以首先对您的表进行子查询以生成有效的经理组。然后,针对这个中间结果使用我上面的答案。

【讨论】:

  • 哇!有效。我以前从未使用过 CASE WHEN。感谢您及时回复。 :)
  • 当我添加列时,假设视图表有 first_name 和 last_name 列,我收到此错误:Error Code: 1055. Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'total_items_revenue.first_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
  • @Zhanrah 姓氏和名字出现在您的原始问题中。如果您正在更改数据模型,那么您可能应该提出一个新问题。将错误消息和数据粘贴到 cmets 中不太可能发生。
  • 糟糕,抱歉,我只是忘记在 SELECT 语句中添加 MAX(...)。我只是想知道那是为了什么?为什么在 GROUP BY CASE WHEN... 中需要它?
  • 只有在使用 group by 时才能选择聚合。如果您可以使用新数据编辑我的演示并将链接粘贴到此处,我可以说更多。
猜你喜欢
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多