Benutzer mit den meisten Antworten
SQL - bei Duplikaten bestimmten Datensatz anzeigen

Frage
-
Hallo zusammen,
ich möchte 2 Tabellen gegenseitig zu vergleichen und bei Duplikaten bei bestimmter Bedingung bestimmten Datensatz auszugeben:
tab1 Art Mge Preis K soll angezeigt werden a1 10 0,98 1 < a2 15 15,22 1 a5 1 123,55 1 < a8 5 26,5 1 < a12 7 58,58 1 < a232 4 12,2 1 tab2 Art Mge Preis K a1 0 0,2 0 a2 15 12,55 0 < a7 2 155,55 0 < a8 0 3,8 0 a232 4 33,6 0 < SELECT Art, Mge, Preis, K FROM tab1 UNION SELECT Art, Mge, Preis, K FROM tab2
es sollen alle aus beiden jeweils 1x angezeigt werden, bei Duplikaten geht k=0 AND Mge > 0 immer vor
Ist der Artikel nur 1x vorhanden AND Mge > 0 dann soll natürlich dieser auch angeigt werden.
Mit < habe ich die Zeilen markiert die angezeigt werden müssten.
Ich bedanke mich im voraus für Eure Hilfe.
Antworten
-
Hi,
probier es mal hiermit:
DECLARE @Table TABLE ( Art nvarchar( 25 ), Mge int, Preis float, K int ) INSERT INTO @Table ( Art, Mge, Preis, K ) VALUES ( 'a1', 10, 0.98, 1 ), ( 'a2', 15, 15.22, 1 ), ( 'a5', 1, 123.55, 1 ), ( 'a8', 5, 26.5, 1 ), ( 'a12', 7, 58.58, 1 ), ( 'a232', 4, 12.2, 1 ), ( 'a1', 0, 0.2, 0 ), ( 'a2', 15, 12.55, 0 ), ( 'a7', 2, 155.55, 0 ), ( 'a8', 0, 3.8, 0 ), ( 'a232', 4, 33.6, 0 ); WITH Query AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY Art ORDER BY CASE WHEN k = 0 AND Mge > 0 THEN 1 WHEN k > 0 AND Mge > 0 THEN 2 ELSE 3 END ) AS RowNumber FROM @Table ) SELECT * FROM Query WHERE RowNumber = 1
Bei den Daten für a8 ist mit deiner Beschreibung keine eindeutige Reihenfolge festlegbar, daher hab ich das noch um eine weitere Abfrage erweitert (k = 0 AND Mge > 0 => 1, k > 0 AND Mge > 0 => 2, ansonsten 3), uem eine eindeutige Sortierung zu erreichen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport- Bearbeitet Stefan FalzModerator Mittwoch, 11. September 2019 13:24
- Als Antwort vorgeschlagen cc_______ Mittwoch, 11. September 2019 13:55
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 27. September 2019 11:13
-
Hi,
damit es etwas besser zu deiner Konstellation (zwei Tabellen mit UNION) passt, hier noch ein erweitertes Beispiel.
Macht zwar bei der eigentlichen Abfrage und im Ergebnis keinen Unterschied, ist aber evtl. für dich besser verständlich.
DECLARE @Table1 TABLE ( Art nvarchar( 25 ), Mge int, Preis float, K int ); DECLARE @Table2 TABLE ( Art nvarchar( 25 ), Mge int, Preis float, K int ); INSERT INTO @Table1 ( Art, Mge, Preis, K ) VALUES ( 'a1', 10, 0.98, 1 ), ( 'a2', 15, 15.22, 1 ), ( 'a5', 1, 123.55, 1 ), ( 'a8', 5, 26.5, 1 ), ( 'a12', 7, 58.58, 1 ), ( 'a232', 4, 12.2, 1 ); INSERT INTO @Table2 ( Art, Mge, Preis, K ) VALUES ( 'a1', 0, 0.2, 0 ), ( 'a2', 15, 12.55, 0 ), ( 'a7', 2, 155.55, 0 ), ( 'a8', 0, 3.8, 0 ), ( 'a232', 4, 33.6, 0 ); WITH UnionQuery AS ( SELECT Art, Mge, Preis, K FROM @Table1 UNION SELECT Art, Mge, Preis, K FROM @Table2 ), Query AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY Art ORDER BY CASE WHEN k = 0 AND Mge > 0 THEN 1 WHEN k > 0 AND Mge > 0 THEN 2 ELSE 3 END ) AS RowNumber FROM UnionQuery ) SELECT * FROM Query WHERE RowNumber = 1
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 16. September 2019 09:00
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 27. September 2019 11:13
Alle Antworten
-
Hi,
probier es mal hiermit:
DECLARE @Table TABLE ( Art nvarchar( 25 ), Mge int, Preis float, K int ) INSERT INTO @Table ( Art, Mge, Preis, K ) VALUES ( 'a1', 10, 0.98, 1 ), ( 'a2', 15, 15.22, 1 ), ( 'a5', 1, 123.55, 1 ), ( 'a8', 5, 26.5, 1 ), ( 'a12', 7, 58.58, 1 ), ( 'a232', 4, 12.2, 1 ), ( 'a1', 0, 0.2, 0 ), ( 'a2', 15, 12.55, 0 ), ( 'a7', 2, 155.55, 0 ), ( 'a8', 0, 3.8, 0 ), ( 'a232', 4, 33.6, 0 ); WITH Query AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY Art ORDER BY CASE WHEN k = 0 AND Mge > 0 THEN 1 WHEN k > 0 AND Mge > 0 THEN 2 ELSE 3 END ) AS RowNumber FROM @Table ) SELECT * FROM Query WHERE RowNumber = 1
Bei den Daten für a8 ist mit deiner Beschreibung keine eindeutige Reihenfolge festlegbar, daher hab ich das noch um eine weitere Abfrage erweitert (k = 0 AND Mge > 0 => 1, k > 0 AND Mge > 0 => 2, ansonsten 3), uem eine eindeutige Sortierung zu erreichen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport- Bearbeitet Stefan FalzModerator Mittwoch, 11. September 2019 13:24
- Als Antwort vorgeschlagen cc_______ Mittwoch, 11. September 2019 13:55
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 27. September 2019 11:13
-
Hi,
damit es etwas besser zu deiner Konstellation (zwei Tabellen mit UNION) passt, hier noch ein erweitertes Beispiel.
Macht zwar bei der eigentlichen Abfrage und im Ergebnis keinen Unterschied, ist aber evtl. für dich besser verständlich.
DECLARE @Table1 TABLE ( Art nvarchar( 25 ), Mge int, Preis float, K int ); DECLARE @Table2 TABLE ( Art nvarchar( 25 ), Mge int, Preis float, K int ); INSERT INTO @Table1 ( Art, Mge, Preis, K ) VALUES ( 'a1', 10, 0.98, 1 ), ( 'a2', 15, 15.22, 1 ), ( 'a5', 1, 123.55, 1 ), ( 'a8', 5, 26.5, 1 ), ( 'a12', 7, 58.58, 1 ), ( 'a232', 4, 12.2, 1 ); INSERT INTO @Table2 ( Art, Mge, Preis, K ) VALUES ( 'a1', 0, 0.2, 0 ), ( 'a2', 15, 12.55, 0 ), ( 'a7', 2, 155.55, 0 ), ( 'a8', 0, 3.8, 0 ), ( 'a232', 4, 33.6, 0 ); WITH UnionQuery AS ( SELECT Art, Mge, Preis, K FROM @Table1 UNION SELECT Art, Mge, Preis, K FROM @Table2 ), Query AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY Art ORDER BY CASE WHEN k = 0 AND Mge > 0 THEN 1 WHEN k > 0 AND Mge > 0 THEN 2 ELSE 3 END ) AS RowNumber FROM UnionQuery ) SELECT * FROM Query WHERE RowNumber = 1
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 16. September 2019 09:00
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 27. September 2019 11:13