9

我正在尝试确定如何在两个表之间进行求和字段。

在表 1 中,我们将其简称为 gegevens,例如 gegevenID、vertrekdatum、prijs

在表 2 中,我们将其称为费用,例如,feeID、gegevenID、amount

我想根据 gegevens 的 year(vertrekdatum) 对 prijs 的值进行求和。

我曾尝试进行 LEFT JOIN 并且它一直有效,直到费用表中有两个相同 gegevenID 的记录。然后它加倍了 prijs。

表格示例:

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 |
--------------------------------------------

当考虑到一个 gegevenID 的费用表中有两行时,此查询导致“prijs”加倍。

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

当有两gegevenID行时,以任何形式加入都会使值加倍fees(如果有三行,则将值加倍,依此类推)。

我能想到的最好的解决方法是独立计算总和——一个价格子查询和一个费用子查询——然后将结果放在一起:

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 回答