微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

需要基于其他表的事务表计数,包括没有匹配项的零

如何解决需要基于其他表的事务表计数,包括没有匹配项的零

我有四个表,其中三个非常静态:haul_types、dumpster_type_team(dumpster_type_team 在 dumpster_types 和团队之间存在多对多关系)和用户。第四个表 hauls 包含交易数据。

haul_types:

id
name

haul_types_data

dumpster_type_team:

id
dumpster_type_id
team_id

dumpster_type_team_data

users:

id
first_name
last_name
is_driver
team_id

users_data

hauls:

haul_type_id
haul_status_id
set_dumpster_type_id
completed_driver_id
team_id

hauls_data

我想要一个包含 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:

expected_results

感谢任何帮助。谢谢

解决方法

问题的描述和查询似乎没有什么关系。我不知道“数据透视表”应该是什么。

我想要一个包含 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 举报,一经查实,本站将立刻删除。