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

Datensätze verbinden

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Jack123, 16 August 2012.

  1. Jack123

    Jack123 Neuer Benutzer

    Hallo,
    Ich habe ein (bestimmt ganz einfaches) Problem:
    In einer Datenbank gibt es eine Kopftabelle mit Projekten Projekt + ID
    Darunter (über die ID) gibt es Einträge: ID(int), ProjektID(int),Bereich(int), Typ(int), Value(real)
    ID: 1...y
    ProjektID: 1...x
    Bereich: 1...z
    Typ: 1 ODER 2
    Value: eine belibige Zahl

    Jetzt möchte ich, über eine Abfrage über EIN Projekt, die folgene Werte erhalten:
    Für jeden Bereich die Summe der Typ1 Values und die Summe der Typ2 Values. Als ein Datensatz.

    Es kann vorkommen, dass es für Typ1 oder Typ2 keine Datensätze gibt, dann soll aber trotzdem die vorhandene Summe ausgegeben werden. Bei keinem Typ1 oder Typ2 für Bereich X gibt es logischerweise auch keinen Bereich X.

    Code:
    Daten:
     
    ID  -  Projekt  -  Bereich  -  Typ  - Value
    1        1          1          1      5
    2        1          1          2      50
    3        1          2          1      33
    4        1          2          2      333
    5        1          1          1      5
    6        1          1          2      50
    7        1          2          1      33
    8        1          2          2      333     
    9        1          3          1      22 
    10       1          3          1      22 
     
     
    Abfrage soll ergeben:
    BereichID - SumOfValue_Typ1 - SumOfValueTyp2
      1            10 (5+5)      100 (50+50)
      2            66 (33+33)    666 (333+333)
      3            44 (22+22)    0 (oder besser NULL??)

    Wie mache ich das?
    Vielen Dank für die Hilfe!

    mfg Jack
     
  2. Tommi

    Tommi Datenbank-Guru

    Hallo Jack,

    das kannst du über die Pivot-Funktion lösen.

    Hier die Syntax:

    SELECT
    Projekt,Bereich,ISNULL([1],0)asSumOfValue_Typ1,ISNULL([2],0)asSumOfValue_Typ2
    FROM
    (SELECTProjekt,Bereich,Typ,ValueFROM#a)a
    PIVOT
    ( SUM(Value) FOR Typ IN([1], [2]) ) as b
    ORDER BYProjekt,Bereich


    VG
     
    PLSQL_SQL und Walter gefällt das.
  3. Jack123

    Jack123 Neuer Benutzer

    Danke!
     
    Walter gefällt das.
  4. Jack123

    Jack123 Neuer Benutzer

    Hallo,
    Habe da nochmal eine Erweiterung, an anderer Stelle aber im Prinzip gleich:

    Code:
    ID  -  Projekt  -  Bereich  -  Typ  - Value  -  Daten
    1        1          1          1      5           2
    2        1          1          2      50          1
    3        1          2          1      33          3
    4        1          2          2      333         5
    5        1          1          1      5           5
    6        1          1          2      50          5
    7        1          2          1      33          5
    8        1          2          2      333         5
    9        1          3          1      22          4
    10       1          3          1      22          5
     
     
    Abfrage soll ergeben:
    BereichID - SumOfValue_Typ1 - SumOfValueTyp2  -      MinOfDaten
      1            10 (5+5)      100 (50+50)                2
      2            66 (33+33)    666 (333+333)              3
      3            44 (22+22)    0 (oder besser NULL??)     4

    Im Prinzip soll also die vorherige Abfrage mit dieser "neuen" verbunden werden:

    Code:
    SELECT Bereich, MIN(Daten) AS MinOfDaten
    FROM  dbo.a
    WHERE (Typ = 1) AND (Projekt = 1)
    GROUP BY Bereich
    Ich möchte also als ausgabe den jeweils minimalen Wert der Spalte "Daten" zu jedem Bereich erhalten. Weiterhin ist es egal was im Datensatz Typ=2 in diesem Feld steht. Es zählen nur die Werte in den Typ=1 Datensätzen.

    Danke nochmals für Eure Mühe!

    mfg Jack
     
  5. Tommi

    Tommi Datenbank-Guru

    Hallo Jack,

    hier habe ich noch eine andere Syntax (die ich persönlich im Übrigen bevorzuge), die dich zum gleichen Ergebnis führt aber zusätzlich leichter erweiterbar (und verständlicher) ist
    (auch mit der von Dir beschriebenen Erweiterung versehen):
    SELECTProjekt,Bereich,
    ISNULL(SUM(CASEWHENTyp=1 THENValueELSENULLEND),0)asSumOfValue_Typ1,
    ISNULL(SUM(CASEWHENTyp=2 THENValueELSENULLEND),0)asSumOfValue_Typ2,
    MIN(Daten)asMinOfDaten
    FROM[TABELLE]
    GROUPBYProjekt,Bereich
    Viele Grüße,
    Tommi
     
    PLSQL_SQL gefällt das.
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