【问题标题】:SQL. How to work/compare/find differences within different rows in the same tableSQL。如何在同一个表的不同行中工作/比较/查找差异
【发布时间】:2010-02-04 02:41:51
【问题描述】:

我有一个如下所示的表格:

ID   Date      Size   Marked
1    2010-02-02    2        X
2    2002-02-02    1
1    2010-02-03    2        X
2    2010-02-03    3        
3    2010-02-03    4        X

我有一个代码 (PHP),它执行以下操作: a) 计算每天的大小总和 b) 找出今天和最后一天的总数之差。 c) 找出今天被标记的行的大小总和(具有相同 id 的行昨天没有被标记)。

例如,我会得到以下结果:

Date        Total  DiffWithYesterday  MarkedThisDay
2010-02-02    3      0                  0
2010-02-03    9      6                  4

我觉得有一种方法可以用 SQL 来编写它。但是我的 SQL 很弱,所以在玩了一天的内部连接、分组和嵌入式选择后我放弃了。

如果你能给我一些如何做到这一点的线索,我将不胜感激。

哦.. 我正在使用 MySQL。

问候, 维克多

【问题讨论】:

    标签: mysql sql comparison


    【解决方案1】:

    玩得开心。

    SELECT 
      today.date as Date, 
      today.total as Total, 
      (today.total - yesterday.total) as DiffWithYesterday  , 
      marked.total as MarkedThisDay
    FROM
      (SELECT date, sum(size) as total
       FROM table_name
       GROUP BY date) today
    LEFT JOIN 
      (SELECT date, sum(size) as total
       FROM table_name
       WHERE marked = 'X'
       GROUP BY date) marked ON today.date = marked.date
    LEFT JOIN
      (SELECT (date + INTERVAL 1 day) as date, sum(size) as total
       FROM table_name
       GROUP BY date) yesterday ON today.date=yesterday.date
    

    显然,您需要将“table_name”替换为您的表名

    【讨论】:

      【解决方案2】:

      类似的东西在 SQL Server 中有效。我没有要测试的 MySQL,但您可能会在看到逻辑后进行转换。

      create table so (sodate datetime, sosize int, somarked varchar(1))
      
      insert into so (sodate,sosize,somarked) values ('1-jan-2010',3,'X')
      insert into so (sodate,sosize,somarked) values ('2-jan-2010',1,'X')
      insert into so (sodate,sosize,somarked) values ('3-jan-2010',2,'X')
      insert into so (sodate,sosize,somarked) values ('4-jan-2010',0,null)
      insert into so (sodate,sosize,somarked) values ('5-jan-2010',2,null)
      insert into so (sodate,sosize,somarked) values ('6-jan-2010',1,null)
      insert into so (sodate,sosize,somarked) values ('6-jan-2010',4,null)
      insert into so (sodate,sosize,somarked) values ('6-jan-2010',1,null)
      insert into so (sodate,sosize,somarked) values ('7-jan-2010',3,'X')
      insert into so (sodate,sosize,somarked) values ('8-jan-2010',3,'X')
      insert into so (sodate,sosize,somarked) values ('9-jan-2010',2,null)
      insert into so (sodate,sosize,somarked) values ('10-jan-2010',2,'X')
      insert into so (sodate,sosize,somarked) values ('11-jan-2010',1,'X')
      insert into so (sodate,sosize,somarked) values ('12-jan-2010',2,null)
      insert into so (sodate,sosize,somarked) values ('13-jan-2010',3,'X')
      
      select so.sodate
          ,sum(so.sosize) as Total
          ,isnull(sum(so.sosize),0) - isnull(min(so2.sosize),0) as DiffFromYesterday
          ,sum(case when so.somarked = 'X' then so.sosize end) as MarkedThisDay
      from so
          left join (select so.sodate,sum(so.sosize) sosize from so group by sodate) so2 on dateadd(dd,1,so2.sodate) = so.sodate
      group by so.sodate  
      

      ..在安装 mysql 之后,这似乎在那里工作......

      select so.sodate
          ,sum(so.sosize) as Total
          ,ifnull(sum(so.sosize),0) - ifnull(min(so2.sosize),0) as DiffFromYesterday
          ,sum(case when so.somarked = 'X' then so.sosize end) as MarkedThisDay
      from so
          left join (select so.sodate,sum(so.sosize) sosize from so group by sodate) so2 on (so2.sodate + INTERVAL 1 day )= so.sodate
      group by so.sodate  ;
      

      【讨论】:

      • 谢谢。这就像一个魅力:) 当我看到第一个答案时,我能够弄清楚如何将它应用于 MySQL。
      猜你喜欢
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多