# Nur bestimmte Spalten auswählen und gruppieren



## Mufasa1601 (26. Juni 2015)

Hallo Freunde,

da wie jeder meiste Neuzugang in diesem Forum, stehe ich auf dem Schlau. Ich hoffe ihr könnt mir helfen, da ich über die Suche nichts gefunden habe. 
Kommen wir zum Problem:
Ich hab eine Tabelle in Oracle mit 5 Spalten, davon möchte ich aber nur 3 angezeigt bekommen.

So sieht die Tabelle momentan aus nachdem selektieren:

Produkt               Marke                 Nummer
Stange                 Mahle                     1
Holz                     Frank                      2
Stange                 Frank                      1
Glas                     Hans                       4
Holz                     Jens                        10
Stange                 Mahle                     3
Glas                      Hans                      6
Holz                     Kurt                        2

bla bla.....

Mein OUTPUT sollte so sein:
Produkt               Marke                 Nummer
Stange                Mahle                     1
Stange                Mahle                     3
Glas                    Hans                       4
Glas                    Hans                       6

D.h. Gleiches Produkt, gleiche Marke unterschiedliche Nummer
Die anderen sollen gar nicht gelistet werden. Aufsteigend sortiert.

oder:
Gleiches Produkt und gleiche nummer, aber unterschiedliche Marke z.B.

Produkt               Marke                 Nummer
Stange                 Mahle                    1
Stange                 Frank                     1
Holz                     Frank                     2
Holz                     Kurt                       2


Mein bisheriger Ansatz für den ersten OUTPUT:
SELECT PRODUKT, MARKE, NUMMER
FROM LISTE
GROUP BY  PRODUKT, NAME, NUMMER
HAVING COUNT (*) >1
ORDER BY PRODUKT ASC, NAME ASC, CAST(NUMMER AS INT) ASC;


Hat jemand ne Ahnung?
Danke


----------



## Yaslaw (26. Juni 2015)

Der Ansatz ist gut. Aber nicht gut genug.
Fall 1: Du musst eine Unterabfrage machen, in der nur nach Produkt & Marke gruppiert und gezählt wird. Dann diejenigen Zurückverknüpfen, bei denen der Zähler grösser als 1 ist.


```
select
    lst.*
from
    (
        select product, marke, count(*) as cnt
        from liste
        group by product, marke
    ) as grp,
    liste as lst
where
    grp.product = lst.product
    and grp.marke = lst.marke
    and grp.cnt > 1
order by product, name, cast(nummer as int)
```

Für den Fall 2 analog. Einfach nach Product & Nummer gruppieren


----------



## Mufasa1601 (26. Juni 2015)

Hallo Yaslaw

danke für die Antwort. Leider bekomm ich den Fehler:
ORA-00933: SQL command not properly ended

Was mach ich falsch? Bin relativ neu in diesem Gebiet.


----------



## Mufasa1601 (26. Juni 2015)

Fehler liegt bei mir in der Zeile 26...bei deinem Bsp. also Zeile 8


----------



## Yaslaw (26. Juni 2015)

Stimmt, ist ja Oracle. Also die Tabellenaliase ohne AS

```
SELECT
    lst.*
FROM
    (
        SELECT product, marke, COUNT(*) AS cnt
        FROM liste
        GROUP BY product, marke
    ) grp,
    liste lst
WHERE
    grp.product = lst.product
    AND grp.marke = lst.marke
    AND grp.cnt > 1
ORDER BY product, name, CAST(nummer AS INT)
```


----------



## Mufasa1601 (26. Juni 2015)

Wieder danke Yaslaw...leider nächster error in zeile 14.
ORA-00918: column ambiguously defined

Woran liegt das? Weil die vllt nicht im SELECT sind?
Nochmals vielen Dank


----------



## Yaslaw (26. Juni 2015)

Jepp. In ORDER BY vor jeden Feldnamen noch ein 'lst.'  setzen

```
ORDER BY lst.product, lst.name, CAST(lst.nummer AS INT)
```

Merkt man, dass ich normalerweise eine Code schreibe und dann schaue wo es knallt?


----------



## Mufasa1601 (26. Juni 2015)

Danke Yaslaw.
Ja in der Tat....obwohl ich jetzt alles so gemacht habe wie du, bekomm ich jetzt alle Spalten. 
Ich habe mehrere Spalten in der Tabelle, will aber nur das die 3 angezeigt und sortiert werden.

Wo liegt das Problem?


----------



## Mufasa1601 (26. Juni 2015)

Er gibt mir auch doppelte raus


----------



## Yaslaw (26. Juni 2015)

Doppelt bringt er nur aus, was doppelt drin ist. Wenn du diese unterbinden willst setze ein DISTINCT.
Umd ie Felder einzugrenzen, liste die Felder im SELECT auf.

```
SELECT DISTINCT lst.product, lst.marke, lst.nummer
FROM
    (..
```


----------



## Mufasa1601 (26. Juni 2015)

Hey klappt alles, aber entspricht nicht meinem OUTPUT.

Bekomme zwar alles sortiert aufsteigend, aber mein OUTPUT sollte nur
Gleiches produkt und gleiche marke, aber unterschiedliche nummer.

Die anderen sollen gar nicht in der liste erscheinen.
BSP:
Product Marke Nummer
Stange Hans 3
Stange Hans 4
Glas Peter 5
Glas Peter 5


----------



## Yaslaw (26. Juni 2015)

Mein Test funktioniert so wie du willst

http://sqlfiddle.com/#!4/47f43/14/0


----------



## Mufasa1601 (26. Juni 2015)

Ja ich sehe es....komisch woran das wohl liegt bei mir?


----------



## Yaslaw (26. Juni 2015)

Keine Ahnung. Wie siehts denn bei dir aus?


----------



## Mufasa1601 (27. Juni 2015)

Ich bekomm irgendwie alles angezeigt.

Hab jetzt mal ne TestTabelle gemacht mit nur exat 3 Spalten und es funktioniert.


----------



## Yaslaw (29. Juni 2015)

Mache doch auf sql-Fiddle eine Testtabelle, wie du sie hast. Dann kann ich mal testen warum es nicht geht


----------



## Mufasa1601 (30. Juni 2015)

Hallo Yaslaw

die Sache ist so:

In der Tabelle werden auch Daten angezeigt, bei denen z.B alles exakt gleich ist, also doppelt.

http://sqlfiddle.com/#!4/e0011c/1/0

Habe mal unten einen Datensatz hinzugefügt.
Diese doppelten soll er mir nicht anzeigen.


----------



## Yaslaw (30. Juni 2015)

http://sqlfiddle.com/#!4/e0011c/3
Im inneren Select habeich den COUNT(*) durch COUNT(DISTINCT "nummer") ersetzt, damit er nur jede Nummer einmal zählt


----------

