SQL使用COUNT和GROUP BY子句连接3个表

SQL使用COUNT和GROUP BY子句连接3个表,sql,sql-server,database,tsql,join,Sql,Sql Server,Database,Tsql,Join,我有3张这样的桌子: EXPEDITION (ID, CreateDate, Status); PACKAGE (ID, EXPEDITION_ID) ITEM (ID, EXPEDIITONPACKAGE_ID); 我需要知道每次远征的包裹数量和物品数量。更新 这似乎是一个问题 SELECT E.ID, P.Packages, I.Items FROM EXPEDITION E LEFT JOIN (

我有3张这样的桌子:

EXPEDITION (ID, CreateDate, Status);
PACKAGE (ID, EXPEDITION_ID)
ITEM (ID, EXPEDIITONPACKAGE_ID);
我需要知道每次远征的包裹数量和物品数量。

更新

这似乎是一个问题

    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进行计数,并在主查询中加入它们以显示结果。

试试这个。还没有测试…但它应该能工作。。 ;以c1为 选择e.expid,counte.expid作为QTYPACK 从包p内部连接 远征e在p.expid=e.expid 按e.expid分组 , C2 as 选择i.pakId、counti.pakId作为qtyItems 从项目i内部连接包p 关于i.pakId=p.pakId 巴基斯坦人分组 选择e.expId、p.qtyPck、I.qtyItems 来自远征队 在p.expId=e.expId上连接包p
在i.pakId=p.pakId上连接项目i

所以你有所有的事情要开始。问题是什么?您是否尝试编写查询以获取此信息?你真的应该包括你解决它的尝试。另外,如果你能提供一些样本数据和最终想要的结果,这将非常有帮助。你试过什么了吗?这是非常基本的东西。是的,我试过了,但是我在COUNTT2.ID2和COUNTT3.ID3中得到了相同的值;您可能想计算这两列中的不同值吗?这是我首先尝试的解决方案,但在这种情况下不起作用。COUNTT2.ID2和COUNTT3.ID3的值始终相同。您当时期望的是什么?没有外部联接,因此联接第一侧的行数将始终与右侧相同。@André发布的联接是内部联接。这将匹配所有表中出现的每个记录ID,因此编号相同。从你的回答来看,你可能想研究一下左、右和外侧joins@Andr这是最新的版本,看看是否适合你。对我来说是这样的。我会拉小提琴,但sqlfiddle目前不太合适。