2016-03-22 4 views
2

Tabelle:Wie man drei Tabelle beitreten und eine Abfrage schreiben? 1

Order_ID Order_Type_ID NAME  Date  
    1   1   Order1 03-07-16 
    2   2   Order2 01-21-16 

Tabelle 2:

ID Order_ID Event_Date 
1   1  03-21-16 
2   2  03-21-16 

Tabelle 3:

ID Order_Type_ID Repeat_Number Repeat_Sequence 
1   1    3     2W 
2   2    2     2M 

Ich brauche eine Abfrage schreiben von über drei Tabellen verknüpft. In Tabelle 1 habe ich eine Liste von Bestellungen mit ihrem Typ und Datum. Tabelle 2 speichert hauptsächlich ein Ereignis, wenn eine Bestellung gesendet wird. Tabelle 3 enthält einen Querverweis für Auftragsarten, der angibt, wie oft eine Bestellung gesendet werden muss und in welchem ​​Intervall. Beispiel: Aufträge mit type_Id 1 müssen dreimal alle zwei Wochen gesendet werden, beginnend mit dem Datum eines Auftrags. Ebenso müssen Aufträge mit type_Id 2 zweimal alle zwei Monate gesendet werden, beginnend mit dem Datum eines Auftrags.

auf Ereignistabelle So basiert (Tabelle 2) Ich brauche Abfrage zu schreiben, zu berechnen, wie oft noch ein Auftrag gesendet werden muss und was die nächsten Termine gesendet.

Zum Beispiel abfragen muß ich soll wie etwas angezeigt schreiben:

Order_ID  Sequence  NAME  Date  
    1   2  Order1 04-04-16 
    1   3  Order1 04-18-16 
    2   2  Order2 07-21-16 

ich es mit Sub-Abfragen schreiben kann, aber würde gerne wissen, ob es ein anderer intelligenter und schneller Ansatz.

Vielen Dank für Hilfe.

+0

Welche Datenbank verwenden Sie? –

+0

In Ihrer erwarteten Ausgabe hat eine Spalte „Sequenz“, es ist nicht in irgendeiner der Tabelle Tabelle 1, Tabelle 2 oder Tabelle 3. Bitte erzählen Sie die Post im Klarschnittformat. –

+0

Sequenz eine inkrementale Zahl, die n-te Zeit beginnen, um gesendet darstellen sollte. Zum Beispiel hat Tabelle 2 ein Ereignis für order_ID 1, was bedeutet, dass die Bestellung einmal gesendet wurde und sie zwei weitere Male gesendet werden muss, d. H. Sequenz 2 und 3. – user2502961

Antwort

0

Sie müssen für diese rekursive CTE verwenden. Unter der Annahme, es SQL Server ist, wird die Abfrage wie folgt sein:

;with c as(
SELECT t1.Order_ID, t1.Order_Type_ID, t1.NAME, t1.Date, 
1 As Sequence, t3.Repeat_Number, t3.Repeat_Sequence 
FROM #Table1 t1 INNER JOIN #Table3 t3 ON t1.Order_Type_ID = t3.Order_Type_ID 
UNION ALL 
SELECT c.Order_ID, c.Order_Type_ID, c.NAME, c.Date, 
c.Sequence+1 As Sequence, c.Repeat_Number, c.Repeat_Sequence 
FROM c WHERE c.Sequence < c.Repeat_Number) 
select Order_ID, Order_Type_ID, Name, Sequence 
, CASE WHEN Repeat_Sequence LIKE '%W' THEN DATEADD(week, Sequence * CAST(REPLACE(Repeat_Sequence, 'W', '') AS INT), Date) 
     WHEN Repeat_Sequence LIKE '%M' THEN DATEADD(month, Sequence * CAST(REPLACE(Repeat_Sequence, 'M', '') AS INT), Date) END from c 
order by Order_ID, Sequence 

Ergebnis:

Order_ID Order_Type_ID Name Sequence  
----------- ------------- ------ ----------- ----------------------- 
1   1    Order1 1   2016-03-21 00:00:00.000 
1   1    Order1 2   2016-04-04 00:00:00.000 
1   1    Order1 3   2016-04-18 00:00:00.000 
2   2    Order2 1   2016-03-21 00:00:00.000 
2   2    Order2 2   2016-05-21 00:00:00.000 

(5 row(s) affected) 

Wenn Sie herausfiltern, die zukünftigen Aufträge sehen, nur dann alle Datensätze weniger als das heutige Datum.

Bitte beachten Sie, dass diese Abfrage für Oracle oder Postgres mit einer kleinen Modifikation um die Funktion DATEADD arbeiten (In Postgres Sie INTERVAL verwenden, in Oracle können Sie nur 7 Tagen hinzufügen für Woche, oder verwenden Sie ADD_MONTHS für Monate)

UPDATE:

Wenn Sie die Auftragsdaten basierend auf dem Veranstaltungstermin berechnen, müssen Sie es auf die Frage, wie diese verbinden können:

;with c as(
SELECT t1.Order_ID, t1.Order_Type_ID, t1.NAME, t2.Event_Date, 
1 As Sequence, t3.Repeat_Number, t3.Repeat_Sequence 
FROM #Table1 t1 INNER JOIN #Table3 t3 ON t1.Order_Type_ID = t3.Order_Type_ID 
INNER JOIN #Table2 t2 ON t1.Order_ID = t2.Order_ID 
UNION ALL 
SELECT c.Order_ID, c.Order_Type_ID, c.NAME, c.Event_Date, 
c.Sequence+1 As Sequence, c.Repeat_Number, c.Repeat_Sequence 
FROM c WHERE c.Sequence < c.Repeat_Number) 
select Order_ID, Order_Type_ID, Name, Sequence 
, CASE WHEN Repeat_Sequence LIKE '%W' THEN DATEADD(week, Sequence * CAST(REPLACE(Repeat_Sequence, 'W', '') AS INT), Event_Date) 
     WHEN Repeat_Sequence LIKE '%M' THEN DATEADD(month, Sequence * CAST(REPLACE(Repeat_Sequence, 'M', '') AS INT), Event_Date) END from c 
order by Order_ID, Sequence 
+0

Danke für deine Antwort, ich habe großartig gearbeitet. Aber ist es möglich, die Daten der nächsten Bestellung basierend auf den Ereignissen in Tabelle 2 zu bestimmen und zu berechnen? Denn wenn ich Repeat_Sequence in Tabelle 3 ändere, ändert sich die Ausgabe. So, basierend auf Ereignissen in table2 ich brauche Zahl zu berechnen Mal Bedürfnisse bestellen von EVENT_DATE in Tabelle gesendet und als nächstes gesendet Datum werden sollten 2. Lassen Sie mich zu berechnen, ob ich nicht klar bin. – user2502961

+0

Sicher Sache. Überprüfen Sie die aktualisierte Antwort – cha

Verwandte Themen