簡體   English   中英

SQL。 如何處理/比較/查找同一表中不同行內的差異

[英]SQL. How to work/compare/find differences within different rows in the same table

我有一張桌子,看起來像這樣:

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。

問候,維克多

這樣的事情在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  ;

玩得很開心。

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”替換為表名

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM