Datensatz ausfiltern über mehrere Zeilen

c_l_d

Neuer Benutzer
Beiträge
2
Hallo zusammen,

habe folgendes Problem und bin noch recht neu im Gebiet SQL.
Am besten erkläre ich das Problem anhand eines Beispiels.

So sieht ein Teil der Tabelle aus:
upload_2014-3-6_9-19-26.png
Ausgabe soll so aussehen:

Niederlassung-----Anzahl89
Dachau-----------------1
Dresden-----------------1

ABER:
Es sollen die Sendugen gezählt werden die einen 89er Status haben. Als Niederlassung soll aber die angezeigt werden, die den ERSTEN 15er Status erzeugt hat!
Z.b. Sendung 111 hat zweimal Status 15. (Einmal in Chemnitz und einmal in Dachau). Es soll aber Dachau angeuzeigt werden da hier der erste 15er am 03.02.2014 erzeugt wurde.

Ich hoffe ich konnte das Problem einigermaßn gut erklären.

Bin für jede Antwort dankbar.

Viele Grüße
Christian
 
Werbung:
ABER:
Es sollen die Sendugen gezählt werden die einen 89er Status haben. Als Niederlassung soll aber die angezeigt werden, die den ERSTEN 15er Status erzeugt hat!


Wenn ich mich nicht vertan habe:

Code:
test=*# select * from cld ;
 sen | status |  nl  |  datum
-----+--------+----------+------------
 111 |  89 |  | 2014-02-20
 111 |  15 | Chemnitz | 2014-02-04
 111 |  15 | Dachau  | 2014-02-03
 222 |  3 | Muenchen | 2014-01-07
 222 |  89 |  | 2014-01-08
 222 |  15 | Dresden  | 2014-01-09
(6 rows)

test=*# select sen_name.nl, count(*) from cld left join (select distinct on (sen) sen, nl from cld where status = 15 order by sen, datum asc) sen_name on cld.sen=sen_name.sen where cld.status = 89 group by sen_name.nl;
  nl  | count
---------+-------
 Dachau  |  1
 Dresden |  1
(2 rows)
 
Hi c_l_d.

Code:
SELECT y.nl as Niederlassung, COUNT(X.sendung) AS Anzahl
FROM (
    SELECT A.sendung, MIN(B.datum) as datum
    FROM cld AS A
    INNER JOIN cld AS B
    WHERE A.status = 89
    AND B.status = 15
    AND A.sendung = B.sendung
    GROUP BY A.sendung) AS X
INNER JOIN  cld AS Y
ON X.sendung = Y.sendung
AND X.datum = Y.datum
GROUP BY Y.nl
Damit solltest du das von dir gewünschte Ergebnis bekommen.
 
Code:
SELECT    t1.Sendung,
        count(*) AS Anzahl,
        t2.NL,
        t2.Datum
FROM    tabelle t1
LEFT JOIN (    SELECT    t3.Sendung,
                    t3.NL,
                    t3.Datum
            FROM    tabelle t3
            WHERE    t3.datum = (    SELECT    min(datum)
                                    FROM    tabelle
                                    WHERE    Sendung = t3.Sendung ) ) t2
ON        t1.Sendung = t2.Sendung
WHERE    t1.[Status] = 89
GROUP BY t1.Sendung
Ich will auch...
Wenn eine Sendung 2x Status 15 mit selben Datum hat müsste man das noch etwas einschränken. Wenn dein Datum auch Zeit beinhaltet sollte es kein Problem geben.

@akretschmer: DISTINCT ON geht glaube ich so nicht in MSSQL. Meine Lösung ist etwas weniger elegant aber sollte in jedem Fall laufen.

@Hony%: Syntaxfehler, kein AS bei Tabellen-Aliasen :) und da fehlt ein ON.
 
Werbung:
Zurück
Oben