我有以下数据库表(简化)
statistics_meter
id | mpan_number
1 | 12345678
2 | 87654321
statistics_contract
id | contract_end_date | meter_id | supplier
1 | 2014-01-10 | 1 | British gas
2 | 2013-12-01 | 1 | Southern Electric
3 | 2014-03-01 | 2 | EON
我的查询旨在获取给定仪表的最新合同结束日期,并将其与供应商一起退回。我已经编写了查询并返回正确的合同结束日期但供应商正在从之前的合同返回 - 因此从两行中返回数据,而不仅仅是一行。
e.g。我得到
2014-01-10|Southern Electric
..不正确。
我的查询:
SELECT
statistics_meter.mpan_number AS mpanNumber,
MAX(statistics_contract.contract_end_date) AS contractEndDate,
statistics_contract.supplier AS supplierName
FROM statistics_contract
INNER JOIN statistics_meter
ON statistics_meter.id=statistics_contract.meter_id
GROUP BY statistics_contract.meter_id
提前感谢您的帮助
答案 0 :(得分:1)
它无法返回同一行中的其他字段,因为没有 同一行 。聚合的概念是从 任意 行数中的值生成单个值。如果表中有1200行满足查询中表示的其他条件,那么对于任何“其他”字段,您希望查询返回哪些可能的1200个其他值?
要从其中一行获取其他数据,您必须准确指定所需的特定行。
SELECT m.mpan_number mpanNumber,
c.contract_end_date, c.supplier supplierName
FROM statistics_contract c
JOIN statistics_meter m
ON m.id=c.meter_id
where contract_end_date =
(Select Max(contract_end_date)
From statistics_contract
Where meter_id = c.meter_id)
...如果statistics_contract
中有多个行具有相同的meter_id
且前一个contract_end_date
,则可能无效。
答案 1 :(得分:1)
您可以使用此SQL查询
SELECT
statistics_meter.mpan_number AS mpanNumber,
s.contract_end_date AS contractEndDate,
s.supplier AS supplierName
FROM statistics_contract AS s
INNER JOIN statistics_meter
ON statistics_meter.id=s.meter_id
WHERE s.contract_end_date = (
SELECT MAX(contract_end_date)
FROM statistics_contract AS sc
WHERE sc.meter_id=s.meter_id
)