如何解决需要基于其他表的事务表计数,包括没有匹配项的零
我有四个表,其中三个非常静态:haul_types、dumpster_type_team(dumpster_type_team 在 dumpster_types 和团队之间存在多对多关系)和用户。第四个表 hauls 包含交易数据。
haul_types:
id
name
dumpster_type_team:
id
dumpster_type_id
team_id
users:
id
first_name
last_name
is_driver
team_id
hauls:
haul_type_id
haul_status_id
set_dumpster_type_id
completed_driver_id
team_id
我想要一个包含 dumpster_types、haul_types 和驱动程序(用户)以及他们参与的运输计数的查询。在某些情况下,应该有一个计数为零,因为有些驱动程序没有为每个 haul_type / 垃圾箱类型组合完成运输。
这是我到目前为止的查询,它的行为似乎是内部联接,因为记录被过滤以仅显示匹配的位置:
SELECT
c.haul_type_id,c.dumpster_type_id,c.driver_id,count(h.id) AS haul_count
FROM
hauls h
RIGHT JOIN ( SELECT disTINCT
ht.id AS haul_type_id,dtt.dumpster_type_id AS dumpster_type_id,dtt.team_id AS team_id,u.id AS driver_id
FROM
haul_types ht
CROSS JOIN dumpster_type_team dtt
CROSS JOIN users u
WHERE
u.team_id = dtt.team_id
AND u.is_driver = TRUE) c ON c.haul_type_id = h.haul_type_id
AND c.dumpster_type_id = h.set_dumpster_type_id
AND c.driver_id = h.completed_driver_id
AND c.team_id = h.team_id
WHERE
h.team_id = 9
AND h.haul_status_id = 3
AND h.completed_driver_id IS NOT NULL
GROUP BY
c.haul_type_id,c.driver_id
当我单独运行子查询时:
SELECT disTINCT
ht.id AS haul_type_id,u.id AS driver_id
FROM
haul_types ht
CROSS JOIN dumpster_type_team dtt
CROSS JOIN users u
WHERE
u.team_id = dtt.team_id
AND u.is_driver = TRUE
我得到了我想要的结果:haul_type、dumpster_type、driver_id 和 team_id 的每个排列对应一行。但是,当我运行整个查询时,尽管连接正确,但我还是得到了过滤结果。
我想要的是以下内容: 如果我有 4 个 haul_types:交付、交换、现场、取货
和 2 个垃圾箱类型:10YD、15YD
和 2 个司机:1、2
我想要一个 haul_type、dumpster_type 和 driver 组合的运输计数。如果没有与该行匹配的运输,则显示 0:
感谢任何帮助。谢谢
解决方法
问题的描述和查询似乎没有什么关系。我不知道“数据透视表”应该是什么。
我想要一个包含 dumpster_types、haul_types 和驱动程序(用户)以及他们参与的运输计数的查询。
这听起来像是用 cross join
来生成行,然后用 left join
/group by
来计算结果:
select d.dumpster_id,ht.haul_type_id,d.driver_id,count(h.driver_id)
from dumpster_types d cross join
haul_types ht cross join
drivers d left join
hauls h
on h.dumpster_id = d.dumpster_id and
h.haul_type_id = ht.haul_type_id and
h.driver_id = d.driver_id
group by d.dumpster_id,d.driver_id;
,
运行@GordonLinoff 提供的查询,暴露了我面临的问题 - 在顶级查询上应用 where 子句时,结果被过滤为仅匹配。我将 where 子句移到了各个子查询中,现在我得到了所有预期的结果。
不确定这是否是最有效的编写方式,但它会产生正确的结果:
SELECT
d.dumpster_type_id,ht.id AS haul_type_id,u.id AS driver_id,count(h.id) AS haul_count
FROM (
SELECT
dumpster_type_id,team_id
FROM
dumpster_type_team
WHERE
team_id = 9) d
CROSS JOIN haul_types ht
CROSS JOIN (
SELECT
users.id
FROM
users
WHERE
users.is_driver = TRUE
AND users.team_id = 9) u
LEFT JOIN (
SELECT
id,set_dumpster_type_id,haul_type_id,completed_driver_id,team_id
FROM
hauls
WHERE
haul_status_id = 3
AND team_id = 9) h ON h.set_dumpster_type_id = d.dumpster_type_id
AND h.haul_type_id = ht.id
AND h.completed_driver_id = u.id
AND h.team_id = d.team_id
GROUP BY
d.dumpster_type_id,ht.id,u.id
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。