Abruf von Mengenangaben aus zwei Tabellen nach ID und datesbereich

Ich habe zwei Tische wie

ItemTable_One

id itemID Date qty =================================================== 1 1 2015-07-1 10 2 1 2015-07-3 20 3 2 2015-07-5 30 4 2 2015-07-7 40 

ItemTable_Two

 id itemID Date qty =================================================== 1 1 2015-07-2 50 2 1 2015-07-4 60 3 3 2015-07-6 70 4 3 2015-07-8 80 

Ich möchte data abrufen, wobei itemID gleich 1 in einem datesbereich ist.
Zum Beispiel (timeraum zwischen 2015-07-1 und 2015-07-30)

 itemID Date ItemTableOne_qty ItemTableTwo_qty ============================================================================ 1 2015-07-1 10 0 1 2015-07-3 20 0 1 2015-07-2 0 50 1 2015-07-4 0 60 

Ich habe versucht, union join und subquery , um es zu tun, aber ich bin sehr schwach in SQL-Abfrage.

Sie können eine FULL OUTER JOIN :

 SELECT COALESCE(t1.itemID, t2.itemID) AS itemID, COALESCE(t1.[Date], t2.[Date]) AS [Date], COALESCE(t1.qty, 0) AS ItemTableOne_qty, COALESCE(t2.qty, 0) AS ItemTableTwo_qty FROM ItemTable_One AS t1 FULL OUTER JOIN ItemTable_Two AS t2 ON t1.itemID = t2.itemID AND t1.[Date] = t2.[Date] WHERE COALESCE(t1.itemID, t2.itemID) = 1 AND COALESCE(t1.[Date], t2.[Date]) BETWEEN '2015-07-01' AND '2015-07-31' ORDER BY COALESCE(t1.[Date], t2.[Date]) 

Dadurch werden datasätze mit demselben [Date] -Wert in den Quellentabellen in die gleiche Zeile der Ausgabetabelle gesetzt.

Wenn Aufzeichnungen von ItemTable_One immer getrennte [Date] -Werte aus datasätzen von ItemTable_Two , dann ist die UNION Lösung, die in anderen Antworten vorgeschlagen wird, vorzuziehen.

Demo hier

Sie können UNION ALL , um alle data zu erhalten, die Sie benötigen:

 SELECT ItemTable_One.itemID, ItemTable_One.Date, ItemTable_One.qty as ItemTableOne_qty, 0 as ItemTableTwo_qty FROM ItemTable_One WHERE ItemTable_One.itemID = 1 AND ItemTable_One.Date BETWEEN '2015-07-01' AND '2015-08-01' UNION ALL SELECT ItemTable_Two.itemID, ItemTable_Two.Date, 0 as ItemTableOne_qty, ItemTable_Two.qty as ItemTableTwo_qty FROM ItemTable_One WHERE ItemTable_Two.itemID = 1 AND ItemTable_Two.Date BETWEEN '2015-07-01' AND '2015-08-01' 

Versuche dies:

 select itemID, Date, qty as ItemTableOne_qty, 0 as ItemTableTwo_qty from ItemTable_One where ItemID = 1 and date >= '20150701' and date < '20150731' union all select itemID, Date, 0 as ItemTableOne_qty, qty as ItemTableTwo_qty from ItemTable_Two where ItemID = 1 and date >= '20150701' and date < '20150731' 

Die obere Grenze für das date ist absichtlich <als das gewünschte date +1, so dass, falls es eine datetime ist, die die time in ihm hat, wird der letzte Tag auch eingeschlossen.

Du machst es mit einer FULL JOIN oder einer UNION ALL (abhängig von der genauen erforderlichen Ausgabe)

VOLLSTÄNDIG

Ein FULL JOIN erlaubt Ihnen, Ergebnisse zu erhalten, wie Sie zeigen, solange es keine identischen data zwischen den 2 Tabellen gibt. Wenn diese data in beiden Tabellen vorhanden sind, bekommst du eine einzelne Zeile pro date mit beiden gefüllten Werten.

Die zu verwendende Abfrage ist:

 SELECT COALESCE(t1.itemID, t2.itemID) itemID, COALESCE(t1.Date, t2.Date) Date, ISNULL(t1.qty, 0) ItemTableOne_qty, ISNULL(t2.qty, 0) ItemTableTwo_qty FROM ItemTable_One t1 FULL JOIN ItemTable_Two t2 ON t1.itemID = t2.itemID AND t1.Date = t2.Date WHERE COALESCE(t1.itemID, t2.itemID) = 1 AND COALESCE(t1.Date, t2.Date) BETWEEN '2015-07-01' AND '2015-08-01' 

UNION ALLES

Eine UNION ALL wird es Ihnen erlauben, resutls wie Sie zeigen zu bekommen und werden doppelte Zeilen erstellen, wo das gleiche date in beiden Tabellen existiert. Es wird immer mindestens 1 '0' Wert in jeder Zeile.

Die zu verwendende Abfrage ist:

 SELECT itemID, Date, qty ItemTableOne_qty, 0 ItemTableTwo_qty FROM ItemTable_One WHERE itemID = 1 AND Date BETWEEN '2015-07-01' AND '2015-08-01' UNION ALL SELECT itemID, Date, 0 ItemTableOne_qty, qty ItemTableTwo_qty FROM ItemTable_Two WHERE itemID = 1 AND Date BETWEEN '2015-07-01' AND '2015-08-01' 

Dies wird der andere path sein, wie wir das gleiche Ergebnis erzielen können, das auf Ihren Beispieldaten basiert

 declare @ItemTable_One table (id int, itemID int, Date date, qty int) insert into @ItemTable_One values (1, 1, '2015-07-1', 10), (2, 1, '2015-07-3', 20), (3, 2, '2015-07-5', 30), (4, 2, '2015-07-7', 40) declare @ItemTable_Two table (id int, itemID int, Date date, qty int) insert into @ItemTable_Two values (1, 1, '2015-07-2', 50), (2, 1, '2015-07-4', 60) , (3, 3, '2015-07-6', 70) , (4, 3, '2015-07-8', 80) ;with CTE AS ( select i.itemID As ItemID1,ii.itemID As ItemID2,i.Date As Dated1,ii.Date As Dated2,i.qty as qty,ii.qty As qty1 from @ItemTable_One i CROSS APPLY (select * from @ItemTable_Two )ii where i.id = ii.id AND i.itemID = ii.itemID ) select * from ( Select ItemID1 As item,Dated1 AS Date, qty,'' as qty1 from CTE UNION Select ItemID2 As item,Dated2 AS Date,'' as qty,qty1 from CTE)T --ORDER BY t.qty desc ,t.qty1 

Verwenden Sie Inline-view zu vereinfachen Horrid sql in früheren Antworten verwendet:

 SELECT * FROM ( SELECT COALESCE(t1.itemID, t2.itemID) AS itemID, COALESCE(t1.[Date], t2.[Date]) AS [Date], COALESCE(t1.qty, 0) AS ItemTableOne_qty, COALESCE(t2.qty, 0) AS ItemTableTwo_qty FROM ItemTable_One AS t1 FULL OUTER JOIN ItemTable_Two AS t2 ON t1.itemID = t2.itemID AND t1.[Date] = t2.[Date] ) AS v WHERE v.itemID = 1 AND v.[Date] BETWEEN '2015-07-01' AND '2015-07-31' ORDER BY v.[Date]