【问题标题】:SQL JOIN 3 TABLES WITH COUNT AND GROUP BY CLAUSESQL JOIN 3 表与 COUNT 和 GROUP BY CLAUSE
【发布时间】:2014-10-22 11:59:55
【问题描述】:

我有 3 个这样的表:

EXPEDITION (ID, CreateDate, Status);
PACKAGE (ID, EXPEDITION_ID)
ITEM (ID, EXPEDIITONPACKAGE_ID);

我需要知道每次探险的包裹数量和物品数量。

【问题讨论】:

  • 这样你就可以开始了。有什么问题?
  • 您是否尝试编写查询来获取此信息?你真的应该包括你解决它的尝试。另外,如果您包含一些示例数据和最终所需的结果,那将非常有帮助。
  • 你有没有尝试过什么?这是非常基本的东西。
  • 是的,我试过了,但我在 COUNT(T2.ID2) 和 COUNT(T3.ID3) 中得到相同的值;
  • 您可能想计算这两列中的 distinct 值吗?

标签: sql sql-server database tsql join


【解决方案1】:

更新

这是似乎有它的查询。

    SELECT 
        E.ID, 
        P.Packages, 
        I.Items 
    FROM EXPEDITION E

    LEFT JOIN (
        SELECT DISTINCT E.ID, COUNT(P.ID) AS "Packages" FROM EXPEDITION E
        LEFT JOIN PACKAGE P
        ON E.ID = P.EXPEDITION_ID
        GROUP BY E.ID
    ) P
    ON E.ID = P.ID

    LEFT JOIN (
        SELECT DISTINCT P.ID as "PackageID", COUNT(I.ID) AS "Items" FROM PACKAGE P
        JOIN ITEM I
        ON P.ID = I.EXPEDIITONPACKAGE_ID
        GROUP BY P.ID
    ) I
    ON P.ID = I.PackageId

    GROUP BY 
        E.ID, 
        P.Packages, 
        I.Items

    ORDER BY 
        E.ID

它有两个内部查询,分别计算 ID,并将它们连接到主查询中以显示结果。

【讨论】:

  • 这是我首先尝试的解决方案,但在这种情况下不起作用,COUNT(T2.ID2) 和 COUNT(T3.ID3) 的值始终具有相同的值跨度>
  • 你当时期待什么?没有outer joins,所以连接的第一侧的行数将始终与右侧相同。
  • @André 发布的联接是内部联接。这将匹配出现在所有表中的每个记录 ID,因此数字是相同的。根据您的回复,您可能想研究左、右和外连接
  • @André - 这是更新版本,看看它是否适合你。它对我有用。会做一个小提琴,但 sqlfiddle 目前不太正确。
【解决方案2】:

试试这个。尚未测试...但它应该可以工作.. ;用 c1 作为 ( 选择 e.expid,count(e.expid) 作为 qtyPck 从包 p 内连接 p.expid = e.expid 上的探险 e 按 e.expid 分组 ), C2 作为 ( 选择 i.pakId, count(i.pakId) 作为 qtyItems 从项目 i 内部加入包 p 在 i.pakId = p.pakId 由 i.pakid 分组 ) 选择 e.expId、p.qtyPck、I.qtyItems 从探险 e 在 p.expId = e.expId 上加入包 p 在 i.pakId = p.pakId 上加入项目 i;

【讨论】:

    猜你喜欢
    • 2021-04-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2010-10-30
    • 2020-05-17
    • 1970-01-01
    相关资源
    最近更新 更多