Flownie: Kriege SQL Abfrage nicht hin

Hallo

Ich kriege eine SQL Abrage einfach nicht so hin, wie ich diese benötige. Es gibt im Feld product_name doppelte Werte. Diese will ich aussondieren, und zwar müsste das Produkt erscheinen, mit dem grössten Volumen. Ausserdem benötige ich die ID von diesem Produkt.

So versuche ich das zu lösen:
SELECT DISTINCT product_name AS product_name, MAX(product_volume) AS product_volume, ID FROM t_produkte GROUP BY product_name

Nun motzt er aber, dass das Feld ID nicht aggregiert und in der Gruppierung aufgeführt wird. Setzte ich aber das ID Feld bei Group By ein, erscheinen natürlich wieder alle Produkte.

Wie kriege ich die Abfrage hin, dass er doppelte Datensätze ausfiltert, den nimmt mit dem grössten Volumen und auch gleich noch die ID von diesem Produkt bringt?

Danke
Marc

  1. Mahlzeit Flownie,

    Ich kriege eine SQL Abrage einfach nicht so hin, wie ich diese benötige. Es gibt im Feld product_name doppelte Werte. Diese will ich aussondieren, und zwar müsste das Produkt erscheinen, mit dem grössten Volumen. Ausserdem benötige ich die ID von diesem Produkt.

    Eine klassische Anforderung für eine korrelierte Unterabfrage. Nutze dieses Stichwort, um bei der allwissenden Müllhalde nachzufragen ... denn da Du uns das von Dir genutzte Datenbanksystem verschwiegen hast, willst Du offenbar keine konkrete Hilfe.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Eine klassische Anforderung für eine korrelierte Unterabfrage. Nutze dieses Stichwort, um bei der allwissenden Müllhalde nachzufragen ... denn da Du uns das von Dir genutzte Datenbanksystem verschwiegen hast, willst Du offenbar keine konkrete Hilfe.

      MSSQL, hatte ich vergessen...

      1. Mahlzeit Flownie,

        MSSQL, hatte ich vergessen...

        Ich zitiere:

        "Hinweis: Vergiss nicht, Namen und Version der von dir verwendeten Datenbank anzugeben!"

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. "Hinweis: Vergiss nicht, Namen und Version der von dir verwendeten Datenbank anzugeben!"

          MSSQL SQLServer 8.0? Keine Ahnung, nehme an das, habe keinen Zugriff auf den Server.

          1. OK, ich kriegs nicht hin, muss aber dringend weitermachen. Könnte mir jemand den genauen Lösungsweg hinschreiben, überweise für die erste Lösung 50€ via PayPal... So, senke nun mein Haupt in Schande, für alle die, die irgendwelche sonstigen Kommentare abgeben wollen. Bitte verkneifen, ist ein Notfall, danke!

            1.   
              SELECT t1.product_name, t1.product_volume, t1.ID  
              FROM t_produkte  AS t1  
              WHERE t1.product_volume = (  
                SELECT MAX(product_volume)  
                FROM t_producte  
                WHERE product_name = t1.product_name  
              )  
              
              
              1. SELECT t1.product_name, t1.product_volume, t1.ID
                FROM t_produkte  AS t1
                WHERE t1.product_volume = (
                  SELECT MAX(product_volume)
                  FROM t_producte
                  WHERE product_name = t1.product_name
                )

                
                >   
                >   
                  
                Vielen Dank für den Vorschlag, es klappt auch beinahe, aber wenn 2 Produkte denselben Namen und das gleiche Volumen haben, werden beide genommen. Es fehlt irgendwie die DISTINCT Angabe. Wenn man dies noch irgendie verhindern könnte, wäre es perfekt!
                
                1. moin,

                  Es fehlt irgendwie die DISTINCT Angabe. Wenn man dies noch irgendie verhindern könnte, wäre es perfekt!

                  nimm den primary key dafür, in deinem falle sollte das die ID spalte sein.

                  SELECT t1.product_name, t1.product_volume, t1.ID
                  FROM t_produkte  t1
                  WHERE t1.product_volume = (SELECT MAX(t2.product_volume)
                                             FROM t_producte t2
                                             WHERE t2.product_name = t1.product_name
                                            )
                  AND t1.ID = (SELECT MIN(t2.ID)
                               FROM t_producte t2
                               WHERE t2.product_name = t1.product_name
                               AND t2.product_volume = t1.product_volume
                              )
                  ;

  2. Hallo

    Ich kriege eine SQL Abrage einfach nicht so hin, wie ich diese benötige. Es gibt im Feld product_name doppelte Werte. Diese will ich aussondieren, und zwar müsste das Produkt erscheinen, mit dem grössten Volumen. Ausserdem benötige ich die ID von diesem Produkt.

    So versuche ich das zu lösen:
    SELECT DISTINCT product_name AS product_name, MAX(product_volume) AS product_volume, ID FROM t_produkte GROUP BY product_name

    Nun motzt er aber, dass das Feld ID nicht aggregiert und in der Gruppierung aufgeführt wird. Setzte ich aber das ID Feld bei Group By ein, erscheinen natürlich wieder alle Produkte.

    Wie kriege ich die Abfrage hin, dass er doppelte Datensätze ausfiltert, den nimmt mit dem grössten Volumen und auch gleich noch die ID von diesem Produkt bringt?

    MSSQL, hatte ich vergessen...

    ---------------------------------------
    GROUP BY Clause

    Specifies the groups into which output rows are to be placed and, if aggregate functions are included in the SELECT clause <select list>, calculates a summary value for each group. When GROUP BY is specified, either each column in any non-aggregate expression in the select list should be included in the GROUP BY list, or the GROUP BY expression must match exactly the select list expression.
    -------------------------------------

    also bietet sich folgendes an:  GROUP BY product_name, ID

    Grüße
    Thomas