我有一张表,其中我保存了不同的仪表(水表,电表),而在另一张表中,我保存了每个表的读数。表结构是这样的:仪表表
MeterID | MeterType | MeterName阅读表:
ReadingID | MeterID | Index | DateOfReading仪表的读数是按月读数的。我现在要做的事情就是在一行中获取仪表信息、当前读数和上一次读数。因此,如果我有一个查询,将产生以下行:
MeterID | MeterType | MeterName | CurrnetIndex | LastIndex到目前为止,我有以下查询:
SELECT Meter.MeterID, Meter.MeterType, Meter.MeterName, CurrentReading.Index, PreviousReading.Index
FROM Meters AS Meter
LEFT OUTER JOIN Readings AS CurrentReading ON Meter.MeterID = CurrentReading.MeterID
LEFT OUTER JOIN Readings AS PreviousReading ON Meter.MeterID = PreviouseReading.MeterID
WHERE CurrentReading.ReadingID != PreviousReading.ReadingID AND DIMESTAMPDIFF(MONTH, CurrentReading.DateOfReading, PreviousReding.DateOfReading)=-1问题是,我可能没有当前读数或以前的读数,或者两者都没有,但我仍然需要检索仪表信息。获取空列对我来说是完全可以接受的,但我仍然需要一行:)
发布于 2010-10-31 05:22:56
使用:
SELECT m.meterid,
m.metertype,
m.metername,
current.index,
previous.index
FROM METER m
LEFT JOIN READING current ON current.meterid = m.meterid
AND MONTH(current.dateofreading) = MONTH(NOW())
LEFT JOIN READING previous ON previous.meterid = m.meterid
AND MONTH(current.dateofreading) = MONTH(NOW())-1作为一个外连接-如果在WHERE子句中进行月份过滤,它可以产生与在ON子句中不同的结果。
发布于 2010-10-31 05:19:21
您可以使用子查询来获取一个月前的值:
select *
, (
select Index
from Readings r2
where r2.MeterID = m.MeterID
and DIMESTAMPDIFF(MONTH, r1.DateOfReading,
r2.DateOfReading) = -1
) as LastIndex
from Meter m
left join
Readings r1
on r1.MeterID = m.MeterID另一种解决方案是让第二个左连接失败。只需将where子句更改为:
WHERE PreviousReading.ReadingID is null
or
(
CurrentReading.ReadingID != PreviousReading.ReadingID
and
DIMESTAMPDIFF(MONTH, CurrentReading.DateOfReading,
PreviousReding.DateOfReading) = -1
)发布于 2010-10-31 05:17:40
sql的理念就是存储你所知道的东西。如果您不知道它,那么就没有任何行可供选择。如果您对搜索的记录集进行了筛选,但什么也找不到,那么就没有任何月份的读数。或者我没有理解这个问题
https://stackoverflow.com/questions/4060708
复制相似问题