CREATE TABLE [arsenal] (
[id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[agent] INTEGER NOT NULL,
[haul] DECIMAL NOT NULL,
[target] INTEGER NOT NULL);
INSERT INTO arsenal (agent, haul, target) VALUES (1, 10, 2), (1, 100, 2), (2, 20, 1), (2, 200, 1);
こんな感じのテーブルがあります。各ユーザーのすべての の合計を取得したいのですhaul
が、ユーザーは と の 2 つの列に分散していagent
ますtarget
。たとえば、ユーザー ID = 1 のエージェントの合計は 110 ですが、ターゲット フィールドの同じユーザーの合計は 220 です。したがって、有効合計は 110 + 220 = 330 です。同様に、ユーザー ID = 2 の有効合計は 330 (エージェント列に 220、ターゲット列に 110)。
私の情報源が次の場合:
id agent haul target
1 1 10 2
2 1 100 2
3 2 20 1
4 2 200 1
、出力が必要です:
user haul
1 330
2 330
. 私はそれを達成することができます:
SELECT user, SUM(sum)
FROM (
SELECT agent AS user, SUM(haul) AS sum
FROM arsenal
GROUP BY agent
UNION ALL
SELECT target, SUM(haul)
FROM arsenal
GROUP BY target
) AS t
GROUP BY user;
Union All に関する実際の選択クエリはもう少し複雑であるため、Union を取り除こうとしているため、それがボトルネックであると想定しています。これを達成するためのより良い方法はありますか?サブクエリがなくてもかまいませんか?
これは非常によく似たスレッドですが、答えは私には魅力的ではありません。ありがとう
編集:実際のクエリは次のとおりです。
SELECT user, SUM(sum)
FROM (
SELECT agent AS user, SUM(haul) AS sum
FROM arsenal AS a
JOIN bucket AS b ON b.parent_id=a.id
JOIN region AS r ON r.terminal = b.terminal
WHERE a.status=@status AND r.savedStatus=@savedStatus
GROUP BY agent
UNION ALL
SELECT target, SUM(haul)
FROM arsenal
JOIN bucket AS b ON b.parent_id=a.id
JOIN region AS r ON r.terminal = b.terminal
WHERE a.status=@status AND r.savedStatus=@savedStatus
GROUP BY target
) AS t
GROUP BY user;
さらに、s にはさらに多くのフィールドがありますSELECT
。ここで注意すべきことは、まったく同じクエリが両方SELECT
の in で2 回実行されていることUNION
です。したがって、私は完全に回避し、冗長性を回避するためにUNION
何らかの方法に依存しようとしています。JOIN