none
SQL - bei Duplikaten bestimmten Datensatz anzeigen RRS feed

  • 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.

    Mittwoch, 11. September 2019 11:39

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


    Mittwoch, 11. September 2019 13:23
    Moderator
  • 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

    Mittwoch, 11. September 2019 13:57
    Moderator

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


    Mittwoch, 11. September 2019 13:23
    Moderator
  • 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

    Mittwoch, 11. September 2019 13:57
    Moderator
  • Moin, 

    hab beide Varianten durchgetestet - beides funzt wunderbar - vielen Dank dafür!

    Montag, 16. September 2019 11:55