none
Abfrage zum Zusammenfassen von Daten RRS feed

  • Frage

  • Hallo,

    mit meinen rudimentären Kenntnissen in SQL bin ich nicht in der Lage folgende Problemstellung zu lösen und ich hoffe jemand kann mir hier weiterhelfen.

    Ich habe folgende Datensätze

    Category;Projekt;Q1,Q2,Q3,Q4
    Kommunikation;NULL;500,0000;250,0000;300,0000
    Kommunikation;Projekt1;3000,0000;0;0;0
    Hardware;Projekt1;2500,0000;0;0;0
    Software;Projekt1;3000,0000;0;0;0
    Hardware;NULL;0;0;0;200,0000

    in einer Tabelle und muss über eine Abfrage zu folgendem Ergebnis kommen

    Category;Summe Projekte;Summe keine Projekte;Summe Gesamt
    Kommunikation;3000,0000;1050,0000;4050,0000

    Kann mir jemand einen Tip geben wie ich die Abfrage schreiben muss, dass abhängig davon ob das Feld Project NULL beinhaltet oder nicht die Summen entsprechend gebildet werden ?

    Vielen Dank im Voraus,

    Stefan

     

    Donnerstag, 6. Oktober 2011 11:48

Antworten

  • Hallo Stefan, das könnte man über ein Case lösen:

    Create Table #daten(Category varchar(20), Projekt varchar(20), Q1 int, Q2
    int, Q3 int, Q4 int);
    insert into #daten(Category,Projekt,Q1,Q2,Q3,Q4) values
    ('Kommunikation',NULL,500,250,300,0);
    insert into #daten(Category,Projekt,Q1,Q2,Q3,Q4) values
    ('Kommunikation','Projekt1',3000,0,0,0);
    insert into #daten(Category,Projekt,Q1,Q2,Q3,Q4) values
    ('Hardware','Projekt1',2500,0,0,0);
    insert into #daten(Category,Projekt,Q1,Q2,Q3,Q4) values
    ('Software','Projekt1',3000,0,0,0);
    insert into #daten(Category,Projekt,Q1,Q2,Q3,Q4) values
    ('Hardware',NULL,0,0,0,200);
    
    Select *
    from #daten;
    
    Select Category, sum(case when Projekt IS NOT Null then Q1+Q2+Q3+Q4 else 0
    end) as [Summe Projekte]
    , sum(case when Projekt IS Null then Q1+Q2+Q3+Q4 else 0 end) as [Summe keine
    Projekte],
    Sum(Q1+Q2+Q3+Q4) as [Summe Gesamt]
    from #daten
    group by Category;
    go
    drop table #daten;

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu

    • Als Antwort markiert rgbg5 Donnerstag, 6. Oktober 2011 12:39
    Donnerstag, 6. Oktober 2011 12:34
  • Hallo Stefan,

    hier eine Lösung:

     

    DECLARE

    @Table TABLE
    (
    Category varchar(20) NOT NULL,
    Projekt varchar(20) NULL,
    Q1 float NOT NULL,
    Q2 float NOT NULL,
    Q3 float NOT NULL,
    Q4 float NOT NULL

    )

     

    INSERT

    INTO @Table
    (Category, Projekt, Q1, Q2, Q3, Q4)
    VALUES
    ('Kommunikation', NULL, 500.0000, 250.0000, 300.0000, 0),
    (
    'Kommunikation','Projekt1',3000.0000,0,0,0),
    (
    'Hardware','Projekt1',2500.0000,0,0,0),
    (
    'Software','Projekt1',3000.0000,0,0,0),
    (
    'Hardware',NULL,0,0,0,200.0000)

    SELECT n.Category, n.SumProjekt, m.SumProjektNull, n.SumProjekt + m.SumProjektNull AS Gesamt
    FROM (
        SELECT Category, Sum(Q1 + Q2 + Q3 + Q4) AS SumProjekt
        FROM @Table
        WHERE Projekt Is Not Null
        GROUP BY Category) AS n
    INNER JOIN (
        SELECT Category, Sum(Q1 + Q2 + Q3 + Q4) AS SumProjektNull
        FROM @Table
        WHERE Projekt Is Null
        GROUP BY Category) AS m
    ON n.Category = m.Category

     

     

     

    Ob Dein Datenmodell Sinn macht sei mal dahingestellt.

    

    Gruß Thomas

    • Als Antwort markiert rgbg5 Donnerstag, 6. Oktober 2011 13:08
    Donnerstag, 6. Oktober 2011 12:49

Alle Antworten

  • Hallo Stefan, das könnte man über ein Case lösen:

    Create Table #daten(Category varchar(20), Projekt varchar(20), Q1 int, Q2
    int, Q3 int, Q4 int);
    insert into #daten(Category,Projekt,Q1,Q2,Q3,Q4) values
    ('Kommunikation',NULL,500,250,300,0);
    insert into #daten(Category,Projekt,Q1,Q2,Q3,Q4) values
    ('Kommunikation','Projekt1',3000,0,0,0);
    insert into #daten(Category,Projekt,Q1,Q2,Q3,Q4) values
    ('Hardware','Projekt1',2500,0,0,0);
    insert into #daten(Category,Projekt,Q1,Q2,Q3,Q4) values
    ('Software','Projekt1',3000,0,0,0);
    insert into #daten(Category,Projekt,Q1,Q2,Q3,Q4) values
    ('Hardware',NULL,0,0,0,200);
    
    Select *
    from #daten;
    
    Select Category, sum(case when Projekt IS NOT Null then Q1+Q2+Q3+Q4 else 0
    end) as [Summe Projekte]
    , sum(case when Projekt IS Null then Q1+Q2+Q3+Q4 else 0 end) as [Summe keine
    Projekte],
    Sum(Q1+Q2+Q3+Q4) as [Summe Gesamt]
    from #daten
    group by Category;
    go
    drop table #daten;

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu

    • Als Antwort markiert rgbg5 Donnerstag, 6. Oktober 2011 12:39
    Donnerstag, 6. Oktober 2011 12:34
  • Fantastisch. Vielen lieben Dank für die schnelle Antwort !

    Stefan

    Donnerstag, 6. Oktober 2011 12:40
  • Hallo Stefan,

    hier eine Lösung:

     

    DECLARE

    @Table TABLE
    (
    Category varchar(20) NOT NULL,
    Projekt varchar(20) NULL,
    Q1 float NOT NULL,
    Q2 float NOT NULL,
    Q3 float NOT NULL,
    Q4 float NOT NULL

    )

     

    INSERT

    INTO @Table
    (Category, Projekt, Q1, Q2, Q3, Q4)
    VALUES
    ('Kommunikation', NULL, 500.0000, 250.0000, 300.0000, 0),
    (
    'Kommunikation','Projekt1',3000.0000,0,0,0),
    (
    'Hardware','Projekt1',2500.0000,0,0,0),
    (
    'Software','Projekt1',3000.0000,0,0,0),
    (
    'Hardware',NULL,0,0,0,200.0000)

    SELECT n.Category, n.SumProjekt, m.SumProjektNull, n.SumProjekt + m.SumProjektNull AS Gesamt
    FROM (
        SELECT Category, Sum(Q1 + Q2 + Q3 + Q4) AS SumProjekt
        FROM @Table
        WHERE Projekt Is Not Null
        GROUP BY Category) AS n
    INNER JOIN (
        SELECT Category, Sum(Q1 + Q2 + Q3 + Q4) AS SumProjektNull
        FROM @Table
        WHERE Projekt Is Null
        GROUP BY Category) AS m
    ON n.Category = m.Category

     

     

     

    Ob Dein Datenmodell Sinn macht sei mal dahingestellt.

    

    Gruß Thomas

    • Als Antwort markiert rgbg5 Donnerstag, 6. Oktober 2011 13:08
    Donnerstag, 6. Oktober 2011 12:49
  • Danke Thomas.

    Die "Daten" sind nicht von mir :-(

     

    Donnerstag, 6. Oktober 2011 13:10
  • Hallo Thomas,

    Deine Lösung dürfte nicht so ganz funktionieren, da hierbei Datensätze unter den Tisch fallen die es mit einem Projekt gibt aber nicht ohne Project. In dem vorliegenden Falle dürfte die Category Software nicht mit erscheinen, da dies in der FROM Klausel rausgefiltert wird.


    Gruß Falk
    Falk Krahl
    Donnerstag, 6. Oktober 2011 13:18
  • Deine Lösung dürfte nicht so ganz funktionieren, da hierbei Datensätze unter den Tisch fallen die es mit einem Projekt gibt aber nicht ohne Project. In dem vorliegenden Falle dürfte die Category Software nicht mit erscheinen, da dies in der FROM Klausel rausgefiltert wird.

    Hallo Falk,

    danke für den Hinweis. Ich hatte nicht auf die Daten an sich geachtet und bin davon ausgegangen dass es DS mit und ohne gibt.

    Daher ist mein Ansatz so falsch, bitte nicht verwenden.

    Gruß Thomas

    Donnerstag, 6. Oktober 2011 13:29