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

Select Union Abfrage

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Mirko Böstro, 20 März 2017.

  1. Mirko Böstro

    Mirko Böstro Benutzer

    Guten Abend,

    ich habe folgenden SQL.

    use tpm
    SELECT Round((CONVERT(numeric(6,2),t2.Ansatz-t1.Verlust)*100) / CONVERT(numeric(6,2),t2.Ansatz),2) AS Prozent, 95 as 'SOLL',

    CASE WHEN convert(nvarchar,DATEPART(m, t1.Datum)) < 10 THEN

    'M 0' + convert(nvarchar,DATEPART(m, t1.Datum))
    ELSE 'M ' + convert(nvarchar,DATEPART(m, t1.Datum)) END AS Datum

    FROM
    (SELECT SUM(TB_VDVerlust.verlust) AS Verlust, TB_VDAusbringung.werkdatum as Datum
    FROM
    TB_VDVerlust
    inner join TB_VDStoerart on TB_VDStoerart.stoerid = TB_VDVerlust.stoerid
    inner join TB_VDAusbringung on TB_VDAusbringung.id = TB_VDVerlust.ausid
    where (TB_VDStoerart.stoerart != 'PT' and TB_VDStoerart.stoerart != 'PB')
    Group BY TB_VDAusbringung.werkdatum

    ) t1
    ,
    (SELECT SUM(dbo.TB_VDAusbringung.ansatz) AS Ansatz,TB_VDAusbringung.werkdatum as Datum
    FROM TB_VDAusbringung
    Group BY TB_VDAusbringung.werkdatum) t2
    where t1.Datum=t2.Datum and t2.Datum between CAST(CAST(YEAR(GETDATE()) AS CHAR(4))+'0101' AS DATETIME)
    and DATEADD(week, DATEDIFF(week, -0, Dateadd(week,-5,getdate())), 0)

    union


    SELECT Round((CONVERT(numeric(6,2),t2.Ansatz-t1.Verlust)*100) / CONVERT(numeric(6,2),t2.Ansatz),2) AS Prozent, 95 as 'SOLL',
    CASE WHEN convert(nvarchar,DATEPART(WEEK, t1.Datum)) < 10 THEN

    'KW 0' + convert(nvarchar,DATEPART(WEEK, t1.Datum))
    ELSE
    'KW ' + convert(nvarchar,DATEPART(WEEK, T1.Datum)) END AS DATUM

    FROM
    (SELECT SUM(TB_VDVerlust.verlust) AS Verlust, TB_VDAusbringung.werkdatum as Datum
    FROM
    TB_VDVerlust
    inner join TB_VDStoerart on TB_VDStoerart.stoerid = TB_VDVerlust.stoerid
    inner join TB_VDAusbringung on TB_VDAusbringung.id = TB_VDVerlust.ausid
    where (TB_VDStoerart.stoerart != 'PT' and TB_VDStoerart.stoerart != 'PB')
    Group BY TB_VDAusbringung.werkdatum
    ) t1
    ,
    (SELECT SUM(dbo.TB_VDAusbringung.ansatz) AS Ansatz,TB_VDAusbringung.werkdatum as Datum
    FROM TB_VDAusbringung
    Group BY TB_VDAusbringung.werkdatum) t2

    where t1.Datum=t2.Datum and t2.Datum between DATEADD(month, DATEDIFF(month, 0, Dateadd(month,-0,getdate())), 0)
    and DATEADD(WEEK, DATEDIFF(WEEK, -0, Dateadd(WEEK,-1,getdate())), 0)
    union
    SELECT Round((CONVERT(numeric(6,2),t2.Ansatz-t1.Verlust)*100) / CONVERT(numeric(6,2),t2.Ansatz),2) AS Prozent, 95 as 'SOLL', convert(nvarchar,t1.Datum,104)as Datum
    FROM
    (SELECT SUM(TB_VDVerlust.verlust) AS Verlust,TB_VDAusbringung.werkdatum as Datum
    FROM
    TB_VDVerlust
    inner join TB_VDStoerart on TB_VDStoerart.stoerid = TB_VDVerlust.stoerid
    inner join TB_VDAusbringung on TB_VDAusbringung.id = TB_VDVerlust.ausid
    where (TB_VDStoerart.stoerart != 'PT' and TB_VDStoerart.stoerart != 'PB')
    Group BY TB_VDAusbringung.werkdatum
    ) t1
    ,
    (SELECT SUM(dbo.TB_VDAusbringung.ansatz) AS Ansatz,TB_VDAusbringung.werkdatum as Datum
    FROM TB_VDAusbringung
    Group BY TB_VDAusbringung.werkdatum) t2

    where t1.Datum=t2.Datum and t1.Datum between DATEADD(dd, DATEDIFF(dd, 0, Dateadd(dd,-7,getdate())), 0)
    and DATEADD(dd, DATEDIFF(dd, 0, Dateadd(dd,-1,getdate())), 0)


    Nun bekomme ich folgende Ergebnisse aus der DB geliefert.

    Prozent Soll Datum
    64.940000000 95 M 01
    86.500000000 95 M 01
    87.080000000 95 KW 09
    87.640000000 95 M 01
    88.430000000 95 M 02
    88.690000000 95 M 02
    89.310000000 95 M 01
    89.920000000 95 KW 10
    91.410000000 95 M 01
    92.020000000 95 M 01
    92.460000000 95 M 01
    92.550000000 95 M 01
    92.810000000 95 M 01
    92.900000000 95 M 02
    92.990000000 95 M 02
    93.780000000 95 M 01
    94.130000000 95 13.03.2017
    94.130000000 95 KW 11
    94.130000000 95 M 01
    94.220000000 95 KW 10
    94.220000000 95 M 01
    94.300000000 95 M 01
    94.650000000 95 M 01
    94.740000000 95 M 02
    94.830000000 95 KW 10
    95.000000000 95 KW 09
    95.090000000 95 M 01
    95.180000000 95 14.03.2017
    95.180000000 95 15.03.2017
    95.180000000 95 M 02
    95.270000000 95 M 01
    95.620000000 95 16.03.2017
    95.710000000 95 17.03.2017
    95.710000000 95 KW 10
    95.880000000 95 M 01
    96.140000000 95 KW 09
    96.490000000 95 KW 09
    96.490000000 95 M 02
    96.840000000 95 M 01
    96.840000000 95 M 02
    97.110000000 95 KW 10
    97.420000000 95 18.03.2017

    Wie schaffe ich es, das z.B. M1 nicht mehrere Werte liefert, sondern einen Wert für den ganzen Monat?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Welchen denn?

    Du suchst eine Aggregation (eine aus min, max, avg vermutlich) sowie eine Gruppierung nach Datum. Vermutlich noch eine Filterung nach deinem komischen Datumsfeld, daß da nur Werte mit M beginnend erfasst werden.
     
  3. ukulele

    ukulele Datenbank-Guru

    Wie akretschmer schon sagt suchst du irgendeine Aggregation. Dein Code ist allerdings sehr unübersichtlich und vermutlich auch nicht ideal. Vor allem aber sorgt das UNION dafür das du deinen ganzen Select vermutlich nochmal klammern musst um über das jetztige Ergebnis eine Aggregation zu machen.
     
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