So entfernen Sie doppelte Zeilen aus der Union-statement

OK – ich habe geschaut und sah und fand viele Beispiele, aber nichts ganz mein Bedürfnis. Vielleicht habe ich die falschen Wörter benutzt, um zu suchen, aber ich könnte deine Hilfe benutzen. Ich werde so viel Detail liefern wie ich kann.

Ich muss einen Bericht erstellen, der Felder aus zwei Tabellen, oder vielmehr eine view und eine Tabelle, in eine Tabelle für einen Bericht zusammenführt. Hier ist die Aussage, die ich verwende:

SELECT A.ConfInt, A.Conference, NULL as Ordered, NULL as Approved, NULL as PickedUp, SUM(dbo.Case_Visit_Payments.Qty) AS Qty FROM dbo.Conferences as A INNER JOIN dbo.Case_Table ON A.ConfInt = dbo.Case_Table.Conference_ID INNER JOIN dbo.Case_Visit_Payments ON dbo.Case_Table.Case_ID = dbo.Case_Visit_Payments.Case_ID WHERE (dbo.Case_Visit_Payments.Item_ID = 15 AND A.ProjectCool = 1) GROUP BY A.Conference, A.ConfInt UNION SELECT B.ConfInt, B.Conference, SUM(dbo.Cool_Fan_Order.NumberOfFansRequested) AS Ordered, SUM(dbo.Cool_Fan_Order.Qty_Fans_Approved) AS Approved, SUM(dbo.Cool_Fan_Order.Qty_Fans_PickedUp) AS PickedUp, NULL AS Qty FROM dbo.Conferences as B LEFT OUTER JOIN dbo.Cool_Fan_Order ON B.ConfInt = dbo.Cool_Fan_Order.Conference_ID where B.ProjectCool = 1 GROUP BY B.Conference, B.ConfInt 

Und hier sind die Ergebnisse:

 4 Our Lady NULL NULL NULL 11 4 Our Lady 40 40 40 NULL 7 Holy Rosary 20 20 20 NULL 11 Little Flower NULL NULL NULL 21 11 Little Flower 5 5 20 NULL 19 Perpetual Help NULL NULL NULL 2 19 Perpetual Help 20 20 20 NULL 

Was ich stark bevorzuge, ist, die Duplizierungsreihen nicht zu haben, wie zum Beispiel:

 4 Our Lady 40 40 40 11 7 Holy Rosary 20 20 20 NULL 11 Little Flower 5 5 20 21 19 Perpetual Help 20 20 20 2 

Ich hoffe, diese Frage war klar genug. Irgendwelche Vorschläge würden sehr geschätzt. Und ich markiere als beantwortet. 🙂

Gregory

Die schnelle Antwort ist, um Ihre Frage in einem anderen zu wickeln,

 SELECT ConfInt , Conference , SUM(Ordered) AS Ordered , SUM(Approved) As Approved , SUM(PickedUp) AS PickedUp , SUM(Qty) AS Qty FROM ( <your UNION query here> ) GROUP BY ConfInt, Conference 

Dies ist nicht der einzige path, um die Ergebnismenge zu erreichen, aber es ist die schnellste Lösung, um die festgelegten Anforderungen zu erfüllen.

Als Alternative, glaube ich, diese Abfragen werden gleichwertige Ergebnisse zurückgeben:

Wir könnten eine korrelierte Unterabfrage in der SELECT-list verwenden, um Menge zu bekommen:

 ;WITH q AS ( SELECT B.ConfInt , B.Conference , SUM(o.NumberOfFansRequested) AS Ordered , SUM(o.Qty_Fans_Approved) AS Approved , SUM(o.Qty_Fans_PickedUp) AS PickedUp FROM dbo.Conferences as B LEFT JOIN dbo.Cool_Fan_Order o ON o.Conference_ID = B.ConfInt WHERE B.ProjectCool = 1 GROUP BY B.ConfInt, B.Conference ) SELECT q.ConfInt , q.Conference , q.Ordered , q.Approved , q.PickedUp , ( SELECT SUM(v.Qty) FROM dbo.Case_Table t JOIN dbo.Case_Visit_Payments v ON v.Case_ID = t.Case_ID WHERE t.Conference_ID = q.ConfInt AND v.Item_ID = 15 ) AS Qty FROM q ORDER BY q.ConfInt, q.Conference 

Oder wir könnten die LEFT JOIN-Operation auf die beiden Abfragen verwenden, anstatt UNION. (Wir wissen, dass die Abfrage, die auf Cool_Fan_Order verweist, die linke Seite des äußeren Join sein kann, weil wir wissen, dass es mindestens so viele Zeilen wie die andere Abfrage zurückgibt (Grundsätzlich wissen wir, dass die andere Abfrage keine Werte von ConfInt zurückgeben kann und Konferenz, die sich nicht in der Abfrage Cool_Fan_Order befinden.)

 ;WITH p AS ( SELECT A.ConfInt , A.Conference , SUM(v.Qty) AS Qty FROM dbo.Conferences as A JOIN dbo.Case_Table t ON t.Conference_ID = A.ConfInt JOIN dbo.Case_Visit_Payments v ON v.Case_ID = t.Case_ID WHERE A.ProjectCool = 1 AND v.Item_ID = 15 GROUP BY A.ConfInt, A.Conference ) , q AS ( SELECT B.ConfInt , B.Conference , SUM(o.NumberOfFansRequested) AS Ordered , SUM(o.Qty_Fans_Approved) AS Approved , SUM(o.Qty_Fans_PickedUp) AS PickedUp FROM dbo.Conferences as B LEFT JOIN dbo.Cool_Fan_Order o ON B.ConfInt = o.Conference_ID WHERE B.ProjectCool = 1 GROUP BY B.ConfInt, B.Conference ) SELECT q.ConfInt , q.Conference , q.Ordered , q.Approved , q.PickedUp , p.Qty FROM q LEFT JOIN p ON p.ConfInt = q.ConfInt AND p.Conference = q.Conference ORDER BY q.ConfInt, q.Conference 

Die Wahl zwischen diesen drei (sie alle geben ein gleichwertiges Ergebnis unter allen Bedingungen zurück), kocht auf Lesbarkeit und Wartbarkeit und performance. Auf groß genug Ruhesorten gibt es einige beobachtbare performancesunterschiede zwischen den drei Aussagen.

Sie können Ihre tatsächliche Abfrage als SubQuery verwenden, verwenden Sie eine aggregierte function (MAX OR SUM) auf Ihre nicht duplizierten Werte und Gruppe durch die nicht aggregierten Spalten

 SELECT ConfInt, Conference, MAX(Ordered), MAX(Approved), MAX(PickedUp), MAX(Qty) FROM (<your actualQuery>) GROUP BY ConfInt, Conference. 

Ich würde einfach die Verbindung zu Cool_Fan_Order in der ersten Auswahl und entfernen Sie die Union.

Gibt es die gleichen Ergebnisse?

  select A.ConfInt, A.Conference, sum(dbo.Cool_Fan_Order.NumberOfFansRequested) as Ordered, sum(dbo.Cool_Fan_Order.Qty_Fans_Approved) as Approved, sum(dbo.Cool_Fan_Order.Qty_Fans_PickedUp) as PickedUp, sum(sub.Qty) as Qty from dbo.Conferences as A left outer join ( select c.ConfInt, cvp.Qty from dbo.Conferences c inner join dbo.Case_Table ct on a.confInt=ct.Conference_ID inner join dbo.Case_Visit_Payments cvp on ct.Case_ID=cvp.Case_ID where cvp.Item_ID=15 ) sub on a.ConfInt=sub.ConfInt left outer join dbo.Cool_Fan_Order on A.ConfInt = dbo.Cool_Fan_Order.Conference_ID where ( A.ProjectCool = 1 ) group by A.Conference, A.ConfInt