首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择该选项可在一行中获取两个条目,这些条目来自同一个表,按日期区分

选择该选项可在一行中获取两个条目,这些条目来自同一个表,按日期区分
EN

Stack Overflow用户
提问于 2010-10-31 05:11:40
回答 3查看 300关注 0票数 3

我有一张表,其中我保存了不同的仪表(水表,电表),而在另一张表中,我保存了每个表的读数。表结构是这样的:仪表表

代码语言:javascript
复制
MeterID | MeterType | MeterName

阅读表:

代码语言:javascript
复制
ReadingID | MeterID | Index | DateOfReading

仪表的读数是按月读数的。我现在要做的事情就是在一行中获取仪表信息、当前读数和上一次读数。因此,如果我有一个查询,将产生以下行:

代码语言:javascript
复制
MeterID | MeterType | MeterName | CurrnetIndex | LastIndex

到目前为止,我有以下查询:

代码语言:javascript
复制
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

问题是,我可能没有当前读数或以前的读数,或者两者都没有,但我仍然需要检索仪表信息。获取空列对我来说是完全可以接受的,但我仍然需要一行:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-31 05:22:56

使用:

代码语言:javascript
复制
   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子句中不同的结果。

票数 2
EN

Stack Overflow用户

发布于 2010-10-31 05:19:21

您可以使用子查询来获取一个月前的值:

代码语言:javascript
复制
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子句更改为:

代码语言:javascript
复制
WHERE  PreviousReading.ReadingID is null
       or 
       (
           CurrentReading.ReadingID != PreviousReading.ReadingID 
           and 
           DIMESTAMPDIFF(MONTH, CurrentReading.DateOfReading,
                         PreviousReding.DateOfReading) = -1
       )
票数 1
EN

Stack Overflow用户

发布于 2010-10-31 05:17:40

sql的理念就是存储你所知道的东西。如果您不知道它,那么就没有任何行可供选择。如果您对搜索的记录集进行了筛选,但什么也找不到,那么就没有任何月份的读数。或者我没有理解这个问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4060708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档