9

2 つのテーブル間でフィールドを合計する方法を決定しようとしています。

表 1 では、略して gegevens と呼びます。たとえば、gegevenID、vertrekdatum、prijs のようになります。

表 2 では、これを料金と呼びます。たとえば、feID、gegevenID、amount となります

gegevens から年 (vertrekdatum) に基づいて prijs の値を取得して合計したいと思います。

私は LEFT JOIN を実行しようとしましたが、手数料のテーブルに同じ gegevenID の 2 つのレコードが存在するまで機能し、それから prijs が 2 倍になりました。

テーブルの例:

GEGEVENS
----------------------------------
gegevenID | vertrekdatum | prijs |
----------------------------------
|      1  | 2011-01-01   |1385.88|
|      2  | 2011-03-01   | 450.26|
|      3  | 2012-01-01   |2505.10|
----------------------------------

FEES
----------------------------
feeID | gegevenID | amount |
----------------------------
|   1 |         2 |   50.00|
|   2 |         2 |  126.00|
|   3 |         3 |   50.00|
----------------------------

私が望む結果は

TOTALS
--------------------------------------------
| year | SumOfPrijs | SumOfFees |  Total   |
--------------------------------------------
| 2011 |  1836.14   |   176.00  |  2012.14 |
| 2012 |  2505.10   |    50.00  |  2555.10 |
--------------------------------------------

このクエリでは、1 つの gegevenID に対して料金表に 2 つの行があったことを考慮すると、'prijs' が 2 倍になりました。

SELECT sum(prijs) as SumOfPrijs, sum(amount) as SumOfFees, sum(prijs)+sum(amount) AS   
Total, year(vertrekdatum) as year
FROM tbl_vluchtgegevens vg
LEFT JOIN tbl_fees f
ON f.gegevenID = vg.gegevenID

WHERE vertrekdatum <=NOW()
GROUP by year(vertrekdatum)

どんな考えでも素晴らしいでしょう。

4

2 に答える 2

16

結合する前にサブクエリを使用して料金テーブルを集計する必要があります。

SELECT sum(prijs) as SumOfPrijs, sum(amount) as SumOfFees, sum(prijs)+sum(amount) AS   
Total, year(vertrekdatum) as year
FROM tbl_vluchtgegevens vg LEFT JOIN
     (select f.gegevenId, sum(amount) as Amount
      from tbl_fees f
      group by f.gegevenId
     ) f
     ON f.gegevenID = vg.gegevenID
WHERE vertrekdatum <=NOW()
GROUP by year(vertrekdatum);

問題は、「gegeven」の複数の料金が原因で、結合によって予期しない行が生成され、合計に影響することです。

于 2013-08-09T14:00:41.113 に答える
3

任意の形式で結合すると、行が 2 つある場合は値が 2 倍になります(gegevenIDfeesが 3 つある場合は値が 3 倍になるなど)。

私が考えることができる最善の回避策は、合計を個別に計算することです-価格の1つのサブクエリと料金の1つのサブクエリ-そして結果をまとめます:

SELECT
  p.year,
  p.SumOfPrijs,
  f.SumOfFees,
  p.SumOfPrijs + f.SumOfFees AS Total
FROM (
  SELECT
    YEAR(vertrekdatum) AS year,
    SUM(prijs) AS SumOfPrijs
  FROM gegevens
  GROUP BY YEAR(vertrekdatum)
) p
LEFT JOIN (
  SELECT
    YEAR(vertrekdatum) as year,
    SUM(amount) AS SumOfFees
  FROM gegevens
  INNER JOIN fees ON gegevens.gegevenID = fees.gegevenID
  GROUP BY YEAR(vertrekdatum)
) f ON p.year = f.year

ここに SQL Fiddle があります。

于 2013-08-09T14:15:26.790 に答える