[英]How to SELECT INTO tableB which name is @tableB * FROM @tableA?
[英]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.