2017-06-17 6 views
0

Wir verwenden Mysql-Datenbank und wir haben Single-Tabellen, die employee_transaction ist.Wählen Sie Einzelfeld in zwei Spalte (Mysql)

employee_transaction Tisch

id | employee_id | date   | transaction_type 
------------------------------------------------------ 
1 | 1   | 2015-01-01  | 1 
2 | 1   | 2015-07-01  | 1 
3 | 1   | 2015-12-31  | 0 
4 | 2   | 2014-02-01  | 1 
5 | 1   | 2016-04-01  | 1 
6 | 2   | 2014-11-30  | 0 
7 | 1   | 2016-08-01  | 1 
8 | 1   | 2016-10-31  | 0 

Und so weiter.

Um das richtige Ergebnis zu erhalten, müssen die folgenden Bedingungen erfüllt werden: - Jeder Mitarbeiter kann nicht konsekutiv TRANSACTION_TYPE hat = 0

  • Erste TRANSACTION_TYPE jeden Mitarbeiter immer 1.
  • ist.
  • das Ergebnis von zwei aufeinanderfolgenden TRANSACTION_TYPE sind below.These Ergebnisse für einen Mitarbeiter ist

    1. Wenn beide TRANSACTION_TYPE = 1. Dann start_date = erstes Transaktionsdatum, end_date = zweites Transaktionsdatum-1 und transaction_type = 1.
    2. Wenn der erste Transaction_type = 1 und der nächste transaction_type = 0 ist. Dann start_date = erstes Transaktionsdatum, end_date = zweites Transaktionsdatum und transaction_type = 1.
    3. Wenn der erste Transaction_type = 0 und der nächste transaction_type = 1 ist. Dann start_date = erstes Transaktionsdatum + 1, end_date = zweite Transaktion date-1 und transaction_type = 0.
    4. Wenn nach transaction_type = 0 keine Transaktion gefunden wird. Dann start_date = erstes Transaktionsdatum + 1, end_date = Null und transaction_type = 0.

Wir brauchen die Abfrage von der employee_transaction Tabelle folgende Ausgabe.

employee_id | start_date  | end_date  | transaction_type 
------------------------------------------------------ 
1   | 2015-01-01  | 2015-06-30  | 1 
1   | 2015-07-01  | 2015-12-31  | 1 
1   | 2016-01-01  | 2016-03-31  | 0 
1   | 2016-04-01  | 2016-07-31  | 1 
1   | 2016-08-01  | 2016-10-31  | 1 
1   | 2016-11-01  | (Null)   | 0 
2   | 2014-02-01  | 2014-11-30  | 1 

Vielen Dank im Voraus.

Wenn Sie irgendwelche Bedenken/Klärung benötigt, setzen Sie mich zurück.

+1

ich die inkompatible Datenbank-Tags entfernt. Bitte markieren Sie die Datenbank, die Sie wirklich verwenden.Auch mit den Daten, die Sie 'order by employee_id, start_date 'bereitgestellt haben, funktioniert'. Die Begründung der Regeln ist ein wenig unklar. Was bedeuten die Transaktionen? –

+0

Hallo @GordonLinoff, ich habe alle Details in der Frage aktualisiert. Danke für den Hinweis. –

+0

Verweisen Sie auf: https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-very-simple- sql-query/333953 # 333953 – Santosh

Antwort

1

Das nächste Datum, nächste transaction_type (sortiert nach Datum) pro employee_id mit einer korrelierten Unterabfrage abrufen. Dann verwenden Sie einen Ausdruck case Ausdruck für die genannten Bedingungen.

select employee_id 
,case when (transaction_type=0 and nxt_t_type=1) or (transaction_type=0 and nxt_t_type is null) then dt+interval '1' day 
else dt 
end as dt 
,case when nxt_t_type=1 then nxt_dt-interval '1' day 
     when transaction_type=1 and nxt_t_type=0 then nxt_dt 
     when transaction_type=0 and nxt_t_type is null then null 
end as nxt_dt 
,transaction_type 
from (select t1.* 
     ,(select t2.dt from t t2 where t1.employee_id=t2.employee_id and t2.dt > t1.dt 
     order by t2.dt limit 1) as nxt_dt 
     ,(select t2.transaction_type from t t2 where t1.employee_id=t2.employee_id and t2.dt > t1.dt 
     order by t2.dt limit 1) as nxt_t_type 
     from t t1 
    ) x 

Sample Demo

+0

Vielen Dank für Ihre Antwort. Ich weiß, dass das Datenbankdesign schlecht ist, aber die Datenbank ändert. Wenn wir Ergebnisse erzielen können. Das wird uns sehr helfen. –

+0

Hallo Wieder, wie im angegebenen Szenario ist das Datum in der Reihenfolge, wenn sie nicht in der Reihenfolge sind, was wir tun müssen. Wir brauchen das gleiche Ergebnis, das du mir gegeben hast. Danke im Voraus. –

0

Hier ist eine Abfrage korrelierte Unterabfragen mit dem sequentiellen Datum und Statusinformationen für jeden Mitarbeiter verbinden:

select 
    f.emp_id, f.trans_date, f.trans_type, 
    (select trans_date from emp_trans 
    where emp_id=f.emp_id and trans_date = (select min(trans_date) 
             from emp_trans where emp_id=f.emp_id 
             and trans_date > f.trans_date) 
    ) as end_trans_date, 
    (select trans_type from emp_trans 
    where emp_id=f.emp_id and trans_date = (select min(trans_date) 
             from emp_trans where emp_id=f.emp_id 
             and trans_date > f.trans_date) 
    ) as end_trans_type 
from emp_trans as f; 
Verwandte Themen