1

次のようなデータがあります。

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

tableB の NUM の合計がすべての tableA ID の合計の平均を上回っている 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

37 > 35、45 > 35、25 < 35 であるため、SELECT は ID 1 と 2 のみを表示する必要があります。

これは正常に動作している私の現在のクエリです:

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
4

2 に答える 2

2

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
于 2011-01-13T01:55:01.993 に答える
1

これにより、1レベル削減されます

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
)
于 2011-01-13T01:49:42.313 に答える