Sql 将GROUP BY子查询嵌入GROUP BY查询

Sql 将GROUP BY子查询嵌入GROUP BY查询,sql,Sql,我的查询需要十列,其中九列是聚合列(八列COUNTs&一列SUM),groupby列出的第一列。有三张桌子。我唯一的问题是如何计算出准确的总和(J.Pieces)J.件数表示交货订单中的件数,按每条路线分组(第一列) 我已经用列出的前两个表对此进行了测试,SUM(J.Pieces)是准确的。当我加入第三个表时(无论是左表、右表、内表),数字都会错误地飙升。我猜它正在查看其他表中的片段列,并相应地添加 现在,我正在尝试对SUM(J.Pieces)进行子查询,使用相同的GROUP BY,但我得到了错

我的查询需要十列,其中九列是聚合列(八列
COUNT
s&一列
SUM
),
groupby
列出的第一列。有三张桌子。我唯一的问题是如何计算出准确的
总和(J.Pieces)
<代码>J.件数表示交货订单中的件数,按每条路线分组(第一列)

我已经用列出的前两个表对此进行了测试,
SUM(J.Pieces)
是准确的。当我加入第三个表时(无论是左表、右表、内表),数字都会错误地飙升。我猜它正在查看其他表中的片段列,并相应地添加

现在,我正在尝试对
SUM(J.Pieces)
进行子查询,使用相同的
GROUP BY
,但我得到了错误,“子查询返回的值超过1。当子查询后跟=、!=、=或子查询用作表达式时,不允许这样做。”

我还尝试通过
COUNT(JSP.PieceID)
获取片段的数量,但这需要连接两个以上的表,然后丢弃其他计数的数量

SELECT    j.Routenumber (1000) , 
          Count(DISTINCT om.ordernumber) AS orders (1000) , 
          ( 
                   SELECT   sum(j.pieces) 
                   FROM     job       AS j 
                   JOIN     ordermain AS om 
                   ON       j.orderid = om.orderid 
                   WHERE    om.customerid = '5' 
                   AND      CONVERT(varchar,om.orderdate,101) = CONVERT(varchar,getdate(),101) 
                   AND      year(om.orderdate)='2019' 
                   GROUP BY j.routenumber) AS pieces (1000) , 
          count( 
          CASE 
                    WHEN oe.eventtype = 'ArriveHub' 
                    AND       oe.note LIKE '%ID#:%' THEN 1 
          END) AS received (1000) , 
          count ( 
          CASE 
                    WHEN oe.eventtype='PieceScan' 
                    AND       oe.note LIKE '%,P,%' THEN 1 
          END) AS pickedup (1000) , 
          count ( 
          CASE 
                    WHEN oe.eventtype='PieceScan' 
                    AND       oe.note LIKE '%,D,%' THEN 1 
          END) AS delivered (1000) , 
          count ( 
          CASE 
                    WHEN oe.eventtype IN ('3rdReturn', 
                                          'BadAddress', 
                                          'Closed', 
                                          'WrongTruck', 
                                          'HolidayCL', 
                                          'FutureReq', 
                                          'HolidayNA', 
                                          'LateTruck', 
                                          'LeftBehind', 
                                          'PaperPOD', 
                                          'TimesUp', 
                                          'Breakdown', 
                                          'Unsafe', 
                                          'Weather', 
                                          'Missort')THEN 1 
          END) AS redelivered (1000) , 
          count ( 
          CASE 
                    WHEN oe.eventtype IN ('Damaged', 
                                          'Refused', 
                                          'RefusedDam')THEN 1 
          END) AS sent_back (1000) , 
          count ( 
          CASE 
                    WHEN oe.eventtype = 'Delivered' 
                    AND       oe.userid > 0 THEN 1 
          END) AS backentered (1000) , 
          count ( 
          CASE 
                    WHEN oe.eventtype='Short' THEN 1 
          END)      AS short (1000) 
FROM      ordermain AS om (1000) 
JOIN      job       AS j 
ON        om.orderid = j.orderid (1000) 
LEFT JOIN orderevent AS oe 
ON        om.orderid = oe.orderid 
WHERE     om.customerid = '5' 
AND       CONVERT(varchar,om.orderdate,101) = CONVERT(varchar,getdate(),101) 
AND       year(om.orderdate)='2019' 
GROUP BY  j.routenumber

我们的目标是为每个路线编号(
J.RouteNumber
)计算出准确的总件数(
J.pieces
),以及剩余列的件数。我可以成功地获得单独的查询,但一次获得所有所需信息是有问题的。

如果您有一个订单,并且该订单有3个事件,那么无论您如何加入第三个表,现在您有3行而不是1行

而是使用相关查询:

  SELECT 
      ( SELECT COUNT( CASE WHEN oe.eventtype IN ('Damaged', 'Refused', 'RefusedDam')
                           THEN 1 
                      END ) 
        FROM orderevent AS oe 
        WHERE om.orderid = oe.orderid ) AS sent_back (1000), 

      ( SELECT COUNT( CASE WHEN oe.eventtype = 'Delivered' 
                            AND oe.userid > 0 
                           THEN 1 
                      END ) 
        FROM orderevent AS oe 
        WHERE om.orderid = oe.orderid ) AS backentered (1000)

JOIN      job       AS j 
ON        om.orderid = j.orderid (1000) 

您使用的是哪种RDBMS?如果您唯一的问题是“j pieces”,那么我认为您可以大大简化这个问题。它是一个基于云的专有软件,具有SQL功能。他们的技术人员不确定出了什么问题,所以我正在尝试其他技术。理想情况下,我希望第三列只给出聚合函数和(J.Pieces),但当我加入OrderEvent表时,该列的结果从27、61、37(正确)到3776106455525。