3
SELECT 
    Income.point, Income.date, SUM(out), SUM(inc)
FROM 
    Income 
LEFT JOIN
    Outcome ON Income.point = Outcome.point 
           AND Income.date = Outcome.date
GROUP BY 
    Income.point, Income.date

UNION

SELECT 
    Outcome.point, Outcome.date, SUM(out), SUM(inc)
FROM 
    Outcome 
LEFT JOIN
    Income ON Income.point = Outcome.point 
           AND Income.date = Outcome.date
GROUP BY 
    Outcome.point, Outcome.date;

私がやりたいのは、参加する前にグループ化することです。「結合とグループ化を含む SQL クエリがあると仮定します。このタイプのクエリを評価する標準的な方法は、最初にすべての結合を実行し、次にグループ化操作を実行することです。ただし、グループ化を実行できる場合があります。 -by アーリー、つまり、group-by 操作を 1 つ以上の結合を超えてプッシュします。アーリー グループ化は、結合に関与するデータの量を減らすことによって、クエリ処理コストを削減する可能性があります。だから私はそれを行う方法の説明が必要です

この場合の運動は次のとおりです。

各アウトレット (ポイント) でのお金の収入 (inc) と費用 (out) が 1 日に何度でも登録されると仮定して、フィールド: アウトレット、日付、費用、収入の結果セットを取得します。

1 つのレコードが各日付の各アウトレットに対応している必要があることに注意してください。

収入と結果の表を使用します。

4

6 に答える 6

1

このコードを試してください

SELECT ip,id,ii,oo FROM
(SELECT I.point ip, I.date id, SUM(I.inc) ii FROM Income I GROUP BY I.point, I.date ) in1
LEFT JOIN
(SELECT O.point op, O.date od, SUM(O.out) oo FROM Outcome O GROUP BY O.point, O.date ) ou1 
ON op=ip AND od=id

UNION

SELECT ip,id,ii,oo FROM
(SELECT I.point ip, I.date id, SUM(I.inc) ii FROM Income I GROUP BY I.point, I.date ) in1
RIGHT JOIN
(SELECT O.point op, O.date od, SUM(O.out) oo FROM Outcome O GROUP BY O.point, O.date ) ou1 
ON op=ip AND od=id

名前も付けてくれる人がいるかもしれません。かっこで囲まれたこれらの SELECT をどのように呼ぶのかさえわかりません... :-/

編集

さて、Luis LL のアイデアを「初期のグループ化」と組み合わせると、次のようになります。

SELECT COALESCE(ip,op) point,COALESCE(id,od) date,ii inc,oo out FROM
(SELECT point ip, date id, SUM(inc) ii FROM Income GROUP BY point, date ) in1
FULL OUTER JOIN
(SELECT point op, date od, SUM(out) oo FROM Outcome GROUP BY point, date ) ou1 
ON op=ip AND od=id

多分それはトリックを行うでしょうか?

于 2013-08-15T19:14:06.003 に答える
0

このデータを 2 つの別々のテーブルに登録する必要があると仮定すると (最も洗練された方法ではありません)、サブクエリを使用して回避できます。UNION はおそらくそれを行う方法ではありません。これは、各「ポイント」のデータセットを 1 つのレコードにまとめるわけではないためです。

于 2013-08-15T19:09:22.073 に答える
0

何を達成したいのかわかりませんが、私の意見では、必要なのはFULL OUTER JOIN

SELECT 
    ISNULL(Income.point, OutCome.point) AS Point, ISNULL(Income.date, OutComeDate) AS [date], SUM(out) AS Expenses, SUM(inc) AS Income
FROM Income 
FULL OUTER JOIN Outcome 
    ON Income.point = Outcome.point AND Income.date = Outcome.date
GROUP BY Income.point, Income.date
于 2013-08-15T19:14:58.400 に答える
-1

あなたの質問を正しく理解していれば、CTEを使用できます。

WITH CTE
AS
(
    SELECT [point]
    ,      [date]
    ,      [SumOut] = SUM([out])
    ,      [SumInc] = SUM([inc])
    FROM Income 
    GROUP BY [point], [date]
)

SELECT CTE.[Point]
,      CTE.[Date]
,      CTE.[SumOut]
,      CTE.[SumInc]
FROM CTE
LEFT JOIN Outcome ON CTE.[point] = Outcome.point AND CTE.[date] = Outcome.[date]
于 2013-08-15T19:08:32.820 に答える