0

私は 3 つのテーブルに参加しようとしています ... months、monthly_results、issue_results です。Monthly_results レコードは 1 か月に 1 つだけですが、1 か月に 0 ~ n の issue_results レコードがあります。Issue_results がないときに Month_results を取得するように Left Join を設定できます。私の問題は、1 か月に複数の issue_results がある場合です。結果セットに month_results を 1 回だけ表示したいのですが、それ以外の場合は、毎月の合計を報告する際に結果を二重にカウントします。

たとえば、ここにテーブルがあります

1、2、3ヶ月

毎月の結果 (月、部数)
(1, 5000)
(2, 2500)
(3, 1000)

発行実績(発行、月、注文)
(1,1,750)
(2,1,500)
(3,3,250)

テーブルに参加するとき、私が見たいのは次のとおりです。

(月、号、部数、注文数) 1、1、5000、750
1、2
、 、500
2、 、
2500、3、3、1000、250

Left Outer Joins を使用すると、2 か月目を取得できます (正しく入力する問題はありません) が、残念ながら、2 か月目に次の重複した月次結果が得られます 1 ...

1, 1, 5000, 750
1, 2, 5000 , 500
2, , 2500,
3, 3, 1000, 250

すべての提案は大歓迎です。

4

2 に答える 2

1

与えられた表には、5000 部が関連付けられている月 1 の号を特定するのに十分な情報がありません。探している結果は、第 2 号ではなく第 1 号に関連付けられた 5000 部を示していますが、表にはその区別をする情報がありません。明確にするために:

月 1 に関する情報を含むテーブルの行は次のとおりです。

毎月の結果:

    (Month, Copies)
    (1,5000)

問題の結果:

    (Issue, Month, Orders)
    (1,1,750)
    (2,1,500)

このように見ると、月次結果テーブルから、5000 部に関連付けられている唯一の情報は月 1 であることがわかります。したがって、問題の結果に参加すると、月 1 の両方の問題が 5000 部に一致します。

探している結果を得るには、次のいずれかを行います:

1) 最初の表には号 (月、号、部数) を含める必要が
あります。 1 か月に 1 件以上の問題があることを示します)。sgeddes は、月の最初の号がコピーを取得する号であるという優れたソリューションを提供しました。

于 2013-07-12T03:33:22.527 に答える
0

RDBMS に応じて、これを実現するさまざまな方法があります。

MySQL ソリューションは次のとおりです。

SELECT M.Month, 
  I.Issue,
  @copies:=IF(@prevMonth=M.Month,NULL,M.Copies) copies,
  I.Orders,
  @prevMonth:=M.Month
FROM MonthResults M
  LEFT JOIN IssueResults I ON M.Month = I.Month
  JOIN (SELECT @copies:=0) t;

サンプル Fiddle デモ

以下は、ほとんどの RDBMS で機能する、より一般的なアプローチです。

SELECT M.Month, 
  I.Issue,
  T.Copies,
  I.Orders
FROM MonthResults M
  LEFT JOIN IssueResults I ON M.Month = I.Month
  LEFT JOIN (
      SELECT Min(I.Issue) minIssue,
        M.Month, M.Copies
      FROM MonthResults M LEFT JOIN IssueResults I ON M.Month=I.Month
      GROUP BY M.Month, M.Copies
) t ON M.Month = t.Month AND (I.Issue = t.minIssue OR I.Issue IS NULL)

そして別の Fiddle デモ

于 2013-02-22T21:50:20.297 に答える