我有以下名为'timtest'的示例表:
itemcode qty_available date
apple 0 1/23/2014
apple 96 1/27/2014
apple 136 2/15/2014
orange 12 1/23/2014
orange 48 2/5/2014
peach 0 1/23/2014
peach 300 2/5/2014
peach 315 2/10/2014
peach 330 2/15/2014
banana 0 1/23/2014
pineapple 24 1/23/2014
我只想在itemcode列中只显示每个唯一值的一个实例。选择为每个唯一商品代码选择哪一行的标准是基于数量大于零而最快的日期任何大于零的数量都可用。如果今天有一个大于零的数量,我想退回那一行。如果今天的日期可用的数量是0,我想在最近的将来找到下一个可用数量大于零的可用记录并返回该行。如果今天有一个零的数量并且没有其他未来的日期,我想返回显示为零的行。此表将永远不会有过去的日期,并且所有记录都将包含今天日期的条目。
以下是上述示例数据的理想结果集,考虑到今天是1/23/2014
:
itemcode qty_available date
apple 96 1/27/2014
orange 12 1/23/2014
peach 300 2/5/2014
banana 0 1/23/2014
pineapple 24 1/23/2014
你能帮我解决正确的问题吗?
答案 0 :(得分:1)
我认为这是你想要获得日期的逻辑:
select itemcode,
coalesce(min(case when qty_available > 0 then date end), min(date)) as thedate
from timtest tt
where date >= date(now())
group by itemcode;
表达式coalesce(min(case when qty > 0 then date end), min(date))
似乎封装了你的逻辑。合并的第一部分返回qty > 0
时的第一个日期。如果这些都不存在,那么它会找到0
的第一个日期。当今天没有记录时,你没有说明该做什么,但0
将来会有记录。这将返回第一个这样的记录。
要获得数量,让我们加入回来:
select tt.*
from timtest tt join
(select itemcode,
coalesce(min(case when qty_available > 0 then date end), min(date)) as thedate
from timtest tt
where date >= date(now())
group by itemcode
) id
on tt.itemcode = id.itemcode and tt.date = id.thedate;
编辑:
没有考虑错误的日期格式。以下是此情况的版本:
select tt.*
from timtest tt join
(select itemcode,
coalesce(min(case when qty_available > 0 then thedate end), min(thedate)) as thedate
from (select tt.*, str_to_date(date, '%m/%d/%Y') as thedate
from timtest tt
) tt
where thedate >= date(now())
group by itemcode
) id
on tt.itemcode = id.itemcode and str_to_date(tt.date, '%m/%d/%Y') = id.thedate;
对未来的建议:将数据库中的日期存储为日期/日期时间数据时间而不是字符串。如果您将商店存储为字符串,请使用YYYY-MM-DD格式,因为您可以使用比较和order by
。