2017-02-21 26 views
-1

我开始了我的职业生涯中的数据分析,我必须在日常工作中使用SQL语句。我正在学习,但还需要提供一些快速解答。所以我想我会在这个小组中提出一些问题。什么是需要超过一天的卸货,我有订单日期和卸货日期

我需要帮助来编写SQL查询来获取需要超过一天或两天(基于rquirement)从该位置释放的订单。

活动类型列代表1,2,3,4

1-Order placed 
2-Order discharged 

日期记录在列日的相应行中

现在我想呼吁所有的订单,要花了超过一定的天数'n'

这是表格的例子,我的表格如何。

活动表

|Order Nr| activity|date| 
|  1 |  1 | date1| order placed 
|  1 |  3 | date2| order approved 
|  1 |  4 | date3| order packed 
|  1 |  2 | date4| order discharged 
+0

感谢Siyual用于在格式化我的问题!问候,赛 – Sai

回答

0

你为了得到拆放同

select * from activities where activity = 1 

,你可能已经猜到如何获得订单排放:-)

所以将二者结合起来,只保留行与过高的区别:

select p.order_nr, p.date as placed, d.date as discharged 
from (select * from activities where activity = 1) p 
join (select * from activities where activity = 2) d 
    on d.order_nr = p.order_nr and datediff(d.date, p.date) > 1; 

你可以得到相同的,每个订单的集合:

select 
    order_nr, 
    any_value(case when activity = 2 then date end) as placed, 
    any_value(case when activity = 1 then date end) as discharged 
from activities 
group by order_nr 
having datediff(any_value(case when activity = 2 then date end), 
       any_value(case when activity = 1 then date end)) > 1; 

如果您要包括未结订单,你会做几乎相同的。对于没有解除记录的订单,可能会在今天输入,因此昨天发出的订单可能仍然正常,而之前发出的订单已经过久。所以如果没有dicharged记录,我们想假装有一个date = today。

查询#1:

select p.order_nr, p.date as placed, d.date as discharged 
from (select * from activities where activity = 1) p 
left join (select * from activities where activity = 2) d 
    on d.order_nr = p.order_nr and datediff(coalesce(d.date, curdate()), p.date) > 1; 

查询#2:

select 
    order_nr, 
    any_value(case when activity = 2 then date end) as placed, 
    any_value(case when activity = 1 then date end) as discharged 
from activities 
group by order_nr 
having datediff(any_value(case when activity = 2 then date end), 
       coalesce(any_value(case when activity = 1 then date end), curdate())) > 1; 
+0

Hello Thorsten,非常感谢!我会在检查结果后立即通知您。问候,赛 – Sai

+0

不客气。我只注意到,我混淆了活动价值。我现在纠正了他们(活动2而不是4)。我的查询没有找到昨天写的订单,并且没有卸货记录,但顺便说一下。如果你想包含这些,你需要在第一个查询中使用外连接并合并,在第二个查询中使用coalesce。告诉我,如果我将这些包含在我的答案中。 –

+0

我注意到订单号,它不是abig问题。如果你可以添加外部联接,那将会很好。我真的很感谢:) – Sai

1

Not exists是一个方法:

select a.* 
from activities a 
where a.activity = 'placed' and 
     not exists (select 1 
        from activities a2 
        where a2.activity = 'discharged' and 
         a2.ordernum = a.ordernum and 
         a2.date >= a.date and 
         a2.date <= a.date + interval 1 day 
       ); 
+0

你好,戈登!我真的很感激你的快速回复。对不起,我不明白后选择查询!非常感谢你!问候,赛 – Sai

+0

@Sai:这意味着:如果不存在相同订单的排出记录,且日期晚于排日期后的一天。 –

+0

@ThorstenKettner'select 1'返回什么? – Sai

相关问题