将SQL聚合函数与多个联接一起使用

田aki

我试图在单个SQL查询(使用Postgres)中的多个表中使用多个聚合函数。

我的表的结构类似于以下内容:

CREATE TABLE user (user_id INT PRIMARY KEY, user_date_created TIMESTAMP NOT NULL);
CREATE TABLE item_sold (item_sold_id INT PRIMARY KEY, sold_user_id INT NOT NULL);
CREATE TABLE item_bought (item_bought_id INT PRIMARY KEY, bought_user_id INT NOT NULL);

我想计算每个用户购买和出售的商品数量。我想到的解决方案不起作用:

SELECT user_id, COUNT(item_sold_id), COUNT(item_bought_id)
FROM user
LEFT JOIN item_sold ON sold_user_id=user_id
LEFT JOIN item_bought ON bought_user_id=user_id
WHERE user_date_created > '2014-01-01'
GROUP BY user_id;

这似乎执行了(item_sold_id,item_bought_id)的所有组合,例如,如果有4个已售商品和2个已购商品,则COUNT()均为8。

如何正确查询表以获取两个计数?

戈登·利诺夫

您查询的简单解决方法是使用distinct

SELECT user_id, COUNT(distinct item_sold_id), COUNT(distinct item_bought_id)
FROM user
LEFT JOIN item_sold ON sold_user_id=user_id
LEFT JOIN item_bought ON bought_user_id=user_id
WHERE user_date_created > '2014-01-01'
GROUP BY user_id;

但是,查询正在做不必要的工作。如果某人购买了100件商品并售出了200件商品,那么该联接将产生20,000个中间行。好多

解决方案是预先汇总结果或在中使用相关的子查询select在这种情况下,我更喜欢相关的子查询解决方案(假设正确的索引可用):

SELECT u.user_id,
       (select count(*) from item_sold s where u.user_id = s.sold_user_id),
       (select count(*) from item_bought b where u.user_id = b.bought_user_id)
FROM user u
WHERE u.user_date_created > '2014-01-01';

正确的索引是item_sold(sold_user_id)item_bought(bought_user_id)由于对user进行了筛选,因此与预聚合相比,我更喜欢这样做这仅针对今年创建的用户进行计算-使用预汇总更困难。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将聚合函数与内部联接一起使用

来自分类Dev

将SUM函数与SQL联接一起使用

来自分类Dev

如何将NULLIF与聚合函数一起使用

来自分类Dev

将ROW_NUMBER()与聚合函数一起使用

来自分类Dev

将构造函数与多个文件一起使用Javascript

来自分类Dev

将FILTER函数与多个条件一起使用

来自分类Dev

将聚合函数与列表项结合在一起时出现SQL错误

来自分类Dev

将WHERE与SUM函数SQL一起使用

来自分类Dev

将游标适配器与多个表游标一起使用(内部联接)

来自分类Dev

如何通过联接表将这个Linq查询与多个参数一起使用

来自分类Dev

将游标适配器与多个表游标一起使用(内部联接)

来自分类Dev

是否可以将Oracle的用户定义的聚合函数定义为与两列一起使用?

来自分类Dev

将更新与内部联接一起使用SQL SERVER 2012

来自分类Dev

将CASE与表联接一起使用

来自分类Dev

将$ exists与$ redact一起使用mongo聚合?

来自分类Dev

将聚合与后计算字段一起使用

来自分类Dev

在SQL Server中将Count()与自联接一起使用

来自分类Dev

将聚合与自定义函数一起使用(使用基于另一列的值)

来自分类Dev

使用索引向量将多个列聚合在一起的巧妙方法

来自分类Dev

将多个参数一起打印以进行记录的函数

来自分类Dev

将函数与多个输出一起使用(非汇总fxn?),并带有汇总

来自分类Dev

使用Merge.xts函数将多个xts文件合并在一起

来自分类Dev

将lapply与多个参数的自定义函数一起使用

来自分类Dev

SPSS:当每种情况具有多个链接的实例时,将IF函数与REPEAT一起使用

来自分类Dev

将多个计数与多个where子句一起使用

来自分类Dev

将 Like 函数与 CDate 函数一起使用

来自分类Dev

与“ IS NULL”一起使用左联接

来自分类Dev

如何使多个变量函数与向量一起使用

来自分类Dev

将 SQL Server Service Broker 与多个路由一起使用

Related 相关文章

  1. 1

    将聚合函数与内部联接一起使用

  2. 2

    将SUM函数与SQL联接一起使用

  3. 3

    如何将NULLIF与聚合函数一起使用

  4. 4

    将ROW_NUMBER()与聚合函数一起使用

  5. 5

    将构造函数与多个文件一起使用Javascript

  6. 6

    将FILTER函数与多个条件一起使用

  7. 7

    将聚合函数与列表项结合在一起时出现SQL错误

  8. 8

    将WHERE与SUM函数SQL一起使用

  9. 9

    将游标适配器与多个表游标一起使用(内部联接)

  10. 10

    如何通过联接表将这个Linq查询与多个参数一起使用

  11. 11

    将游标适配器与多个表游标一起使用(内部联接)

  12. 12

    是否可以将Oracle的用户定义的聚合函数定义为与两列一起使用?

  13. 13

    将更新与内部联接一起使用SQL SERVER 2012

  14. 14

    将CASE与表联接一起使用

  15. 15

    将$ exists与$ redact一起使用mongo聚合?

  16. 16

    将聚合与后计算字段一起使用

  17. 17

    在SQL Server中将Count()与自联接一起使用

  18. 18

    将聚合与自定义函数一起使用(使用基于另一列的值)

  19. 19

    使用索引向量将多个列聚合在一起的巧妙方法

  20. 20

    将多个参数一起打印以进行记录的函数

  21. 21

    将函数与多个输出一起使用(非汇总fxn?),并带有汇总

  22. 22

    使用Merge.xts函数将多个xts文件合并在一起

  23. 23

    将lapply与多个参数的自定义函数一起使用

  24. 24

    SPSS:当每种情况具有多个链接的实例时,将IF函数与REPEAT一起使用

  25. 25

    将多个计数与多个where子句一起使用

  26. 26

    将 Like 函数与 CDate 函数一起使用

  27. 27

    与“ IS NULL”一起使用左联接

  28. 28

    如何使多个变量函数与向量一起使用

  29. 29

    将 SQL Server Service Broker 与多个路由一起使用

热门标签

归档