Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Datensatz ausfiltern über mehrere Zeilen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von c_l_d, 6 März 2014.

  1. c_l_d

    c_l_d Neuer Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru


    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)
    
     
  3. Hony%

    Hony% Datenbank-Guru

    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.
     
  4. ukulele

    ukulele Datenbank-Guru

    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.
     
  5. c_l_d

    c_l_d Neuer Benutzer

    Danke euch:)
    Habs mit der Lösung von Hony% hinbekommen.
    Vielen Dank nochmal :) :)
     
  6. Hony%

    Hony% Datenbank-Guru

    Kein AS? MS-SQL Eigenart? :D

    Das mit dem ON stimmt. Geht aber für gewöhnlich auch mit WHERE.

    Gerne. :)
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Ich Schelm ;-) Vergesse ich immer wieser ...
     
  8. Hony%

    Hony% Datenbank-Guru

    Korrelierende Subselects sind böse. Mir ist zwar immer noch nicht so ganz klar wie man da Optimieren hätte müssen um das mit Subselect zu laufen zu bekommen. Aber ich halte es deswegen für sinnvoller wenn möglich darauf zu verzichten.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden