回答

收藏

当我们在Joins中使用Aggregate函数时,如何使用Group By子句?

技术问答 技术问答 319 人阅读 | 0 人回复 | 2023-09-13

我想加入三个表并计算表A的总和(数量)。我尝试了一些操作,然后得到了所需的输出。但是我仍然对基于聚合函数和Group By子句感到困惑。
% C$ H/ ?: }5 u9 I通过连接两个或多个表来计算总和值时,我们需要在Group By子句中提及哪些列,为什么我们需要提供这些列?
/ \; e: |# b) V& P/ F5 Y& s, {例如:这是我的表和所需的查询。
9 b# a7 C& U. ]TableA: ItemID, JobOrderID, CustomerID, DivisionID, Quantity
/ v  G2 ?& p1 c5 I0 J. P- \. M' STableB: ItemID, ItemName, SpecificationID7 d' P8 e. \% I+ d/ C, {
TableC: SpecificationID, SpecificationName1 ~1 x$ P; |$ T4 s
TableD: DivisionID, DivisionName
# R# Z6 b! K$ V- u. x0 w; ITableE: JobOrderID, JobOrderNo.% J! O7 k$ s2 M0 ]2 _+ O) e- b' ~
TableF: CustomerID, CustomerName! _6 k* }2 @" S4 A' R+ I4 }
我想根据获得的总和(数量)ItemID,CustomerID,JobOrderID和DivisionID。# v4 Q; g. N+ c3 Z/ v
我写了以下查询,它工作正常。但是,如果我删除Group By子句中的任何列,则不会得到期望的结果。为什么?Group
7 W8 m4 e1 U, F2 PBy子句在这里做什么?使用Aggregate函数时如何指定Group By子句?这是我的查询。. f7 ]+ `! t9 r6 L7 B1 C( H
    SELECT / O' e8 P% `% w$ N
            B.ItemName + ' - ' + C.SpecificationName AS 'ItemName',
) ]. j) c; n- X- e  E& k) I            SUM(A.Quantity) AS 'Quantity',) d$ x/ J* ?/ \* a2 S$ @8 k
            A.ItemID,/ p6 V1 o9 }  R9 c5 m0 G! I
            D.DivisionName,& O3 E0 F; M. J+ M
            F.CustomerName,
# H% k& ~7 s  W6 ?$ \8 X            E.JobOrderNo,0 G2 h' H5 k5 |8 M7 \+ x6 m/ m
            A.DivisionID,/ x1 W7 [, }- J0 P% Z
            A.JobOrderID,7 j. _0 N% Z5 @2 {( `- C$ H
            A.CustomerID
9 v7 g8 k+ G$ F# n3 J5 C    FROM
9 C' _, R/ t' n0 d4 ^            TableA A  
" a* {" B8 ]% E0 D* Q! ^& o            INNER JOIN TableB B ON B.ItemID = A.ItemID ; u, n! U  ?2 f; c3 c) r
            INNER JOIN TableC C ON C.SpecificationID = B.SpecificationID
. V+ k2 H4 A+ b9 V            INNER JOIN TableD D ON D.DivisionID = A.DivisionID0 v% K) x! f8 g( C) a4 z! g
            LEFT JOIN TableE E ON E.JobOrderID = A.JobOrderID# y) F7 j4 l7 d; g
            LEFT JOIN TableF F ON F.CustomerID = A.CustomerID6 G! Q3 G+ O6 y) k
    WHERE
& }7 m0 L4 h$ O& l- F" D9 r            A.ItemID = @ItemID
& G, A) O% \% H1 F" E. d# {8 I    GROUP BY
2 N3 n* g7 b" A; \            A.ItemID,1 l/ e4 z% {( g9 Z
            A.JobOrderID,
+ w* O4 V) M4 ^: q+ w7 W            A.DivisionID,
+ Q; M; f. b' x1 F2 L8 s5 P: N            A.CustomerID,5 f- l6 c  H( ?  @% F4 `
            D.DivisionName,
( ?2 V, e+ j0 z6 E3 a            F.CustomerName,
/ {1 n5 W9 ~3 E, z4 W            E.JobOrderNo,
. y: D: x( J$ j; A            B.ItemName,  B( g4 M' z1 x/ z1 D) A& E  ^* R9 O
            C.SpecificationName% F+ A" o6 E+ R
任何人都可以以“ Group by Clause”为例提出建议。
' Q! }- v/ j) t$ f1 I9 g( Y                & Q+ r( R) p( {$ {
解决方案:
& r+ M( }' M9 L. \/ ?& u$ G4 i, v                ! x7 h$ E/ c5 j& K
4 _# H. P6 x' {+ [' U- q3 _( x
7 o% |! H0 q, n; a0 P5 l
                GROUP BY对于指定列的任何唯一组合,都会进行汇总(例如sum,min等)。如果未在GROUP
2 l! Z' V' a4 u7 Z2 F' W1 h2 p; ABY子句或聚合函数中指定某些列名,则SQL引擎将未知该列名,该值应针对该类型的列返回。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则