回答

收藏

SQL-汇总函数中的子查询

技术问答 技术问答 300 人阅读 | 0 人回复 | 2023-09-14

我正在使用northwind数据库通过创建一些或多或少复杂的查询来刷新我的SQL技能。不幸的是,我找不到最后一个用例的解决方案:“获得1997年每个类别的五个最大订单的总和。”
7 N. p: W1 F" o0 Z涉及的表是:
) A- ^5 ]6 ?' o% uOrders(OrderId, OrderDate)* y$ m: T& m5 L$ [7 U
Order Details(OrderId, ProductId, Quantity, UnitPrice)
! A2 `8 x: H; q1 C9 Y( y  C" q, GProducts(ProductId, CategoryId)- U; v& Y' f" Z6 [) N
Categories(CategoryId, CategoryName)
( H8 x! f' J0 s我尝试了以下查询5 f2 r* ?  S. }" h" \- t
SELECT c.CategoryName, SUM(& N; c/ [) x, Y& _! Q5 M: b8 J
  (SELECT TOP 5 od2.UnitPrice*od2.Quantity
; w! k' u6 @# W   FROM [Order Details] od2, Products p2$ ?: F( ?; Z0 o9 z% T) v# w
   WHERE od2.ProductID = p2.ProductID' b5 t0 c5 @: Q. \9 Q. q$ Q) Z
   AND c.CategoryID = p2.CategoryID
, w! x- W+ x5 k   ORDER BY 1 DESC)): W. H$ h. X& @  ^* z4 j
FROM [Order Details] od, Products p, Categories c, Orders o
0 g& n5 H" _' Z2 Y1 P7 EWHERE od.ProductID = p. ProductID
6 w! V# U+ ?$ I) B. R8 FAND p.CategoryID = c.CategoryID
0 {7 ^9 h# U+ e& q$ m& |3 D9 A' QAND od.OrderID = o.OrderID3 @: Z3 ?9 K' J
AND YEAR(o.OrderDate) = 1997# U, {  X. g! K3 p$ d
GROUP BY c.CategoryName" ]* G0 D# {- c1 p
好吧……原来,子查询在聚合函数中是不允许的。我已经阅读了有关此问题的其他文章,但是找不到针对我的特定用例的解决方案。希望你能帮我…* ~4 @; N* A) R5 B- o  S* k# `
                . {6 ]' g) o" B/ J* w! i
解决方案:8 R3 k% Z. L( p
               
! s) @1 r+ e+ d# [# T9 i
/ G; w8 |) P' @
4 o2 V. L: ]' r8 [1 K                聚合函数中通常不允许使用子查询。相反,移动骨料 内 的子查询。在这种情况下,由于top 5:
) B$ M9 p5 }( JSELECT c.CategoryName,2 U7 h8 y. N% }7 o# d
  (select sum(val)
4 ]: ^' {3 B2 |! [% i   from (SELECT TOP 5 od2.UnitPrice*od2.Quantity as val
$ Q. V: x  L  R         FROM [Order Details] od2, Products p2
  a% G/ }/ p' A" t; k         WHERE od2.ProductID = p2.ProductID- J/ j8 e" o5 e* w2 L4 L
         AND c.CategoryID = p2.CategoryID1 z7 P+ h! n# W5 E) p
         ORDER BY 1 DESC
% L3 Q$ E* q3 Q) g+ E& k; D. \        ) t
/ P" w; q  |. ~2 s* ^4 \3 Y" a  )
* v- P; [+ J4 \. _* T: Z" yFROM [Order Details] od, Products p, Categories c, Orders o - Y1 L% @3 D  D
WHERE od.ProductID = p. ProductID
7 m( B9 g6 j8 m: Z6 {5 c4 f$ G1 c# `AND p.CategoryID = c.CategoryID
" ?3 x  H2 C4 p. c8 P& bAND od.OrderID = o.OrderID
) c' g7 n$ Y9 U) B: qAND YEAR(o.OrderDate) = 1997
0 X7 C3 C: w5 [6 K0 u8 B% H2 yGROUP BY c.CategoryName, c.CategoryId
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则