2017-02-21 3 views
-1

私はデータ分析で私のキャリアを始めたので、日々の仕事でSQL文を使用する必要があります。私は学んでいますが、いくつかの迅速な回答も提供する必要があります。だから私はこのグループのいくつかの質問をするつもりだと思った。私は解雇に1日以上かかった注文は何ですか、私は注文と放電の日付を持っています

私は、場所から退出するために(rquirementに基づいて)2日以上かかる注文を得るためにSQLクエリを書くのに役立つ必要があります。アクティビティ列の

タイプ1,2,3,4-

1-Order placed 
2-Order discharged 

日は、対応する行

の列の日付に記録されている今私はそれにすべての注文を要求したい表します特定の日数を超えていました

これはテーブルの表示例です。

活動表

|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! Greetings、Sai – Sai

答えて

0

あなたは

select * from activities where activity = 1 

でオーダーの配置を取得し、あなたはおそらく:-)順放電を取得する方法を推測することができます

ので、2つは組み合わせて、高すぎる差が行だけを保つ:

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; 

、あなたはほとんど同じことをします。退院記録のない注文については、今日入力される可能性があります。そのため、昨日の注文はまだうまくいくかもしれませんが、前の注文はすでに長すぎます。ですから、二重記録がない場合は、今日の日付=であることをふりまとめたいと思います。

クエリ#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

こんにちはThorsten、ありがとうございました!私は結果を確認した直後にあなたに知らせます。ごあいさつ、サイ – Sai

+0

ようこそ。私はちょうど気づいた、私は活動値を混乱させた。私はそれらを今修正しました(放電のために4の代わりに活動2)。私の質問では、昨日の前に書かれた注文は見つかりませんし、放電記録もありません。これらを含める場合は、最初のクエリで外部結合と結合が必要で、第2の結合で合体が必要です。私が答えにこれらを含めるならば教えてください。 –

+0

私は注文番号に気付きました。外部結合を追加できればいいですね。私は本当に感謝しています:) – 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

こんにちはゴードン!私は本当にあなたの迅速な返答に感謝します。私は申し訳ありませんが、私はdid notは存在しない後に選択クエリを理解しています!どうもありがとうございました! Greetings、Sai – Sai

+0

@Sai:これは、次のように解釈されます。配置日から1日後の日付で、同じ注文番号の排出レコードが存在しない場合。 –

+0

@ThorstenKettner 'select 1'は何を返しますか? – Sai

関連する問題