簡體   English   中英

如何從tableA中選擇高於tableB中分組平均值的組合數之和?

[英]How to select from tableA sum of grouped numbers from tableB above their sums average in Oracle?

我有這樣的數據:

tableA.ID
---------
1
2
3

tableB.ID tableB.NUM
--------------------
1         10
1         15
2         18
3         12
2         12
2         15
3         13
1         12

我需要選擇tableA ID,其中tableB中其NUM的總和高於所有tableA ID總和的平均值。 換一種說法:

SUM ID=1 -> 10+15+12 = 37
SUM ID=2 -> 18+12+15 = 45
SUM ID=3 -> 12+13    = 25

AVG ALL IDs -> (37+45+25)/3 = 35

SELECT必須僅顯示ID 1和2,因為37> 35、45> 35但25 <35。

這是我當前的查詢,可以正常工作:

SELECT tableA.ID
FROM tableA, tableB
WHERE tableA.ID = tableB.ID
HAVING SUM(tableB.NUM) > (
    SELECT AVG(MY_SUM)
    FROM (
        SELECT SUM(tableB.NUM) MY_SUM
        FROM tableA, tableB
        WHERE tableA.ID = tableB.ID
        GROUP BY tableA.ID
    )
)
GROUP BY tableA.ID

但是我感覺沒有所有這些嵌套的SELECT可能會有更好的方法。 也許2,但3感覺太多了。 我可能是錯的。

例如,為什么我不能做這樣簡單的事情:

SELECT tableA.ID
FROM tableA, tableB
WHERE tableA.ID = tableB.ID
HAVING SUM(tableB.NUM) > AVG(SUM(tableB.NUM))
GROUP BY tableA.ID

或這個:

SELECT tableA.ID, SUM(tableB.NUM) MY_SUM
FROM tableA, tableB
WHERE tableA.ID = tableB.ID
HAVING MY_SUM > AVG(MY_SUM)
GROUP BY tableA.ID

在SQL Server中,您可以執行此操作。 不知道它是否適用於Oracle。 我敢肯定,如果沒有的話,我會盡快發現!

WITH cte As (
SELECT 
      tableA.ID, 
      SUM(tableB.NUM) AS MY_SUM, 
      AVG(SUM(tableB.NUM)) over() As Average
FROM tableA, tableB
WHERE tableA.ID = tableB.ID
GROUP BY tableA.ID
)
SELECT ID 
FROM cte 
WHERE MY_SUM > Average

這應該將其減少一級

SELECT tableA.ID
FROM tableA, tableB
WHERE tableA.ID = tableB.ID
GROUP BY tableA.ID
HAVING SUM(tableB.NUM) > (
    SELECT SUM(tableB.NUM)/COUNT(DISTINCT tableA.ID)
    FROM tableA, tableB
    WHERE tableA.ID = tableB.ID
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM