将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

将WHERE与SUM函数SQL一起使用

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

将CASE与表联接一起使用

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

Related 相关文章

  1. 1

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

  2. 2

    将WHERE与SUM函数SQL一起使用

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

    将CASE与表联接一起使用

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

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

  23. 23

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

  24. 24

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

  25. 25

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

  26. 26

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

  27. 27

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

  28. 28

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

  29. 29

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

热门标签

归档