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。