|
我正在使用northwind数据库通过创建一些或多或少复杂的查询来刷新我的SQL技能。不幸的是,我找不到最后一个用例的解决方案:“获得1997年每个类别的五个最大订单的总和。”/ _ y, V; I9 m3 U3 Q+ ~4 r- M
涉及的表是:
1 X+ q' `+ J4 [" T- KOrders(OrderId, OrderDate)
3 Y( R+ A$ _- _+ H Z/ _Order Details(OrderId, ProductId, Quantity, UnitPrice)7 W% b' {: {: s' s' X
Products(ProductId, CategoryId), L; J3 C6 {$ v# C) z' d1 N; y
Categories(CategoryId, CategoryName)/ E) {0 V# c. |
我尝试了以下查询
1 }' a: ?9 a/ ?! LSELECT c.CategoryName, SUM( G& g. @/ V' U
(SELECT TOP 5 od2.UnitPrice*od2.Quantity 8 l) M! N# ~6 X3 ]
FROM [Order Details] od2, Products p2$ u: Z! `( }( d- }2 r" C/ x
WHERE od2.ProductID = p2.ProductID
1 |% Q' n3 D; s. I# A, E AND c.CategoryID = p2.CategoryID" O7 m& P" ?8 W. I% ]% B' Z
ORDER BY 1 DESC))
7 V/ k% n4 T" p% b2 i/ wFROM [Order Details] od, Products p, Categories c, Orders o
f) [" M; R8 qWHERE od.ProductID = p. ProductID
) M7 i. W2 d- p' S" F) X$ mAND p.CategoryID = c.CategoryID, F, D* O1 s- K
AND od.OrderID = o.OrderID, x: b1 Q _' A; j
AND YEAR(o.OrderDate) = 1997( C3 N& U! [8 V6 O
GROUP BY c.CategoryName& l+ \8 _9 L! c) w0 I; J2 ~
好吧……原来,子查询在聚合函数中是不允许的。我已经阅读了有关此问题的其他文章,但是找不到针对我的特定用例的解决方案。希望你能帮我…
2 ~- X( o# M9 X2 J ) M# F* O6 B2 L# w3 W
解决方案:
5 L2 J+ C$ n/ M3 ~, j1 o
; x/ i2 a& H$ _ ?- i$ f- V, d
3 c$ f8 g! U1 V: _: C6 s0 G
3 Z3 Q$ y; p6 P. a! _# ?0 I 聚合函数中通常不允许使用子查询。相反,移动骨料 内 的子查询。在这种情况下,由于top 5:
9 f8 Q4 ~3 S& Y K8 o! y) @# MSELECT c.CategoryName,( A2 L' i% H- N! H7 I8 E
(select sum(val)( C s3 O+ l2 J# N) X
from (SELECT TOP 5 od2.UnitPrice*od2.Quantity as val
' C9 ?0 R0 B8 E$ {. |) w% s FROM [Order Details] od2, Products p2
, ^4 }5 t* D# W3 E; A5 \/ s$ G WHERE od2.ProductID = p2.ProductID8 V, t5 \" L/ s! U
AND c.CategoryID = p2.CategoryID" V0 |' z+ |/ Y
ORDER BY 1 DESC) _8 @% Y; ]5 ^& H& v# q
) t$ b* c- ?3 ]) |- [& v- a
)) C; t! R7 c7 m! l
FROM [Order Details] od, Products p, Categories c, Orders o
+ s, A: f5 _+ D9 X. z' m- T" y. b1 [WHERE od.ProductID = p. ProductID
9 t3 p9 D# z1 M& [, s7 gAND p.CategoryID = c.CategoryID7 z$ C; M0 P; R9 v4 u8 N
AND od.OrderID = o.OrderID
, b6 O) M3 D2 J( H" `) i) QAND YEAR(o.OrderDate) = 1997
/ _+ Y& \$ X" r. ]- ZGROUP BY c.CategoryName, c.CategoryId |
|