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

Daten weiter einschränken, ist das möglich?

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Hazel4tw1, 31 Juli 2014.

  1. Hazel4tw1

    Hazel4tw1 Aktiver Benutzer

    Hallo zusammen,

    ist ein einschränken von Daten so von der Logik her Prinzipiell möglich?
    Ein Bild sagt mehr als 1000 Worte:

    upload_2014-7-31_8-54-38.png


    Ich versuche quasi die Anzahl des grünen Kreises und des Roten Kreises zu kriegen.

    oder:

    die Ergebnisse dieser beiden Abfragen in einer:

    Select COUNT(Number) as Anzahlkomp,DAY(Solved_Date_Time) as Tag
    from dbo.ServiceTickets
    where CSC_NOC ='1' and MONTH(Solved_Date_Time) ='07' and YEAR(Solved_Date_Time) ='2014'
    group by DAY(Solved_Date_Time)

    upload_2014-7-31_9-10-22.png


    Select COUNT(Number) as Anzahlnoc,DAY(Solved_Date_Time) as Tag
    from dbo.ServiceTickets
    where Service_Organisation_Displayname ='CSC_NOC' and MONTH(Solved_Date_Time) ='07' and YEAR(Solved_Date_Time) ='2014'
    group by DAY(Solved_Date_Time)

    upload_2014-7-31_9-10-46.png

    Daraus habe ich das gemacht:


    Select t1.Anzahlkomp,t1.Tag,COUNT(t2.Number) as Anzahlnoc
    from
    (
    Select COUNT(Number) as Anzahlkomp,DAY(Solved_Date_Time) as Tag
    from dbo.ServiceTickets
    where CSC_NOC ='1' and MONTH(Solved_Date_Time) ='07' and YEAR(Solved_Date_Time) ='2014'
    group by DAY(Solved_Date_Time)
    ) as t1,
    ServiceTickets as t2
    where Service_Organisation_Displayname ='CSC_NOC' and MONTH(Solved_Date_Time) ='07' and YEAR(Solved_Date_Time) ='2014'
    group by t1.Anzahlkomp, t1.Tag




    Ich denke mir jetzt eigentlich das Anzahlkomp und Anzahlnoc gleich sind, da die zweite Where Klausel doch eigentlich beide "Counts" auf den kleinsten "Kreis" reduziert


    Raus kommt aber:

    upload_2014-7-31_9-13-13.png


    Anzahlkomp ist richtig?!
    Kann jemand erklären wo mein DenkFehler dabei ist?


    und warum AnzahlNoc nur 20991 anzeigt?

    EDIT:
    Select t1.Anzahlkomp,t1.Tag,COUNT(t2.Number) as Anzahlnoc, DAY(t2.Solved_Date_Time)
    from
    (
    Select COUNT(Number) as Anzahlkomp,DAY(Solved_Date_Time) as Tag
    from dbo.ServiceTickets
    where CSC_NOC ='1' and MONTH(Solved_Date_Time) ='07' and YEAR(Solved_Date_Time) ='2014'
    group by DAY(Solved_Date_Time)
    ) as t1,
    ServiceTickets as t2
    where Service_Organisation_Displayname ='CSC_NOC' and MONTH(Solved_Date_Time) ='07' and YEAR(Solved_Date_Time) ='2014'
    group by t1.Anzahlkomp, t1.Tag, DAY(Solved_Date_Time)

    Wenn ich das so mache ist Anzahlkomp nicht richtig

    upload_2014-7-31_9-31-55.png




    Danke und Gruß
     

    Anhänge:

    Zuletzt bearbeitet: 31 Juli 2014
  2. akretschmer

    akretschmer Datenbank-Guru

    Du machst einen implizieten CROSS JOIN, suchst aber ein UNION ALL stattdessen. Im äußeren SELECT suchst Du eine Aggregation, hier sum*( ), in Verbindung mit einer Gruppierung.

    Ansonsten bist aber sehr nah dran ...
     
  3. Hazel4tw1

    Hazel4tw1 Aktiver Benutzer

    Select t1.Anzahlkomp,t1.Tag,COUNT(t2.Number) as Anzahlnoc, DAY(t2.Solved_Date_Time)
    from
    (
    Select COUNT(Number) as Anzahlkomp,DAY(Solved_Date_Time) as Tag
    from dbo.ServiceTickets
    where CSC_NOC ='1' and MONTH(Solved_Date_Time) ='07' and YEAR(Solved_Date_Time) ='2014'
    group by DAY(Solved_Date_Time)
    ) as t1,
    ServiceTickets as t2
    where Service_Organisation_Displayname ='CSC_NOC' and MONTH(Solved_Date_Time) ='07' and YEAR(Solved_Date_Time) ='2014'
    group by t1.Anzahlkomp, t1.Tag, DAY(Solved_Date_Time)


    [​IMG]

    Falls du das meinst mit der Summe und Gruppierung.


    Und was meinst du mit Cross Join und Union All? Wo join ich denn etwas?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    as t1,
    ServiceTickets as t2
     
  5. ukulele

    ukulele Datenbank-Guru

    Ohne jetzt alles gelesen zu haben du könntest auch noch mit einer CASE Schleife in der count() Funktion arbeiten.
     
  6. Hazel4tw1

    Hazel4tw1 Aktiver Benutzer

    Da ich mit meiner Abfrage nicht weiter komme, habe ich es mal mit der Case Funktion versucht:

    mit einer kommen noch halb richtige ergebnisse:

    select DAY(Solved_Date_Time), case when CSC_NOC = '1' then COUNT(Number) end
    from ServiceTickets
    where MONTH(Solved_Date_Time) ='07' and YEAR(Solved_Date_Time) ='2014'
    group by CSC_NOC, DAY(Solved_Date_Time)
    order by DAY(Solved_Date_Time)

    upload_2014-7-31_12-34-5.png


    aber bei beiden kommt nichts mehr

    select DAY(Solved_Date_Time), case when CSC_NOC = '1' then COUNT(Number) when Service_Organisation_Displayname='CSC_NOC' then COUNT(Number) end
    from ServiceTickets
    where MONTH(Solved_Date_Time) ='07' and YEAR(Solved_Date_Time) ='2014'
    group by CSC_NOC, DAY(Solved_Date_Time), Service_Organisation_Displayname
    order by DAY(Solved_Date_Time)



    upload_2014-7-31_12-34-31.png
     
  7. Hazel4tw1

    Hazel4tw1 Aktiver Benutzer

    Oder meinst du das so?
    Select DAY(Solved_Date_time), COUNT(case WHEN CSC_NOC ='1' Then Number else '0' end) as gesamt, COUNT(case WHEN Service_Organisation_Displayname ='CSC_NOC' Then Number else '0' end) as gesamtnoc
    from ServiceTickets
    where MONTH(Solved_Date_Time) ='07' and YEAR(Solved_Date_Time) ='2014'
    group by DAY(Solved_Date_time)

    upload_2014-7-31_12-53-7.png
     
  8. ukulele

    ukulele Datenbank-Guru

    Letzteres meinte ich ja. Aber irgendwas scheint da noch nicht zu gehen, mach mal:
    Code:
    SELECT    day(Solved_Date_time),
            sum(    CASE
                    WHEN    CSC_NOC = '1'
                    THEN    1
                    ELSE    0
                    END ) AS gesamt,
            sum(    CASE
                    WHEN    Service_Organisation_Displayname = 'CSC_NOC'
                    THEN    1
                    ELSE    0
                    END ) AS gesamtnoc
    FROM    ServiceTickets
    WHERE    month(Solved_Date_Time) = 7
    AND        year(Solved_Date_Time) = 2014
    GROUP BY day(Solved_Date_time)
    und wenn das noch nicht passt dann:
    Code:
    SELECT    t.tag,
            sum(t.gesamt) AS gesamt,
            sum(t.gesamtnoc) AS gesamtnoc
    FROM    (
    SELECT    day(Solved_Date_time) AS tag,
            (    CASE
                WHEN    CSC_NOC = '1'
                THEN    1
                ELSE    0
                END ) AS gesamt,
            (    CASE
                WHEN    Service_Organisation_Displayname = 'CSC_NOC'
                THEN    1
                ELSE    0
                END ) AS gesamtnoc
    FROM    ServiceTickets
    WHERE    month(Solved_Date_Time) = 7
    AND        year(Solved_Date_Time) = 2014
    ) t
    GROUP BY t.tag
     
  9. Hazel4tw1

    Hazel4tw1 Aktiver Benutzer

    Danke, beide Abfragen funktionieren.

    Du hast mir neue Welten geöffnet mit der CASE Anweisung und der Summe von 1.

    Danke dafür
     
  10. ukulele

    ukulele Datenbank-Guru

    Sowas hier sollte aber auch gehen:
    Code:
    SELECT    t1.tag,
            t1.gesamt,
            t2.gesamtdoc
    FROM    (
    SELECT    day(Solved_Date_time) AS tag,
            count(*) AS gesamt
    FROM    ServiceTickets
    WHERE    month(Solved_Date_Time) = 7
    AND        year(Solved_Date_Time) = 2014
    AND        CSC_NOC = '1'
    GROUP BY day(Solved_Date_time)
    ) t1
    FULL JOIN (
    SELECT    day(Solved_Date_time) AS tag,
            count(*) AS gesamtnoc
    FROM    ServiceTickets
    WHERE    month(Solved_Date_Time) = 7
    AND        year(Solved_Date_Time) = 2014
    AND        Service_Organisation_Displayname = 'CSC_NOC'
    GROUP BY day(Solved_Date_time)
    ) t2
    ON        t1.tag = t2.tag
    Allerdings passt deine Grafik nicht ganz zu den Auswertungen. Service_Organisation_Displayname = 'CSC_NOC' würde auch gezählt, wenn CSC_NOC ungleich '1'. Ich bin mir jetzt nicht sicher ob du das willst. Wenn nicht, kann man das ja noch einbauen.
     
  11. Hazel4tw1

    Hazel4tw1 Aktiver Benutzer

    Hallo,

    du hast recht. Nur von der Logik der Daten her ist das so.
    Also wenn CSC_NOC ungleich '0' ist kann Service_Organisation_Displayname nicht = 'CSC_NOC' sein.

    Deine letzte Abfrage gibt aber leider falsche Ergebnisse aus, bzw nicht die gleichen wie meine kleine 2 Abfragen von mir, bzw deine CASE Formel. Welche alle die gleichen Ergebnisse geben.

    Aber das passt so mit der CASE Anweisung und erfüllt 100% seinen Zweck und ist für mich auch nachvoll ziehbar :D
     
  12. ukulele

    ukulele Datenbank-Guru

    Okay es gibt halt viele Wege in diesem Fall und die unterscheiden sich im wesentlichen durch Übersichtlichkeit und vieleicht auch etwas durch Performance aber das dürfte wenig sein.
     
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