Select Union Abfrage

Mirko Böstro

Benutzer
Beiträge
12
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?
 
Werbung:
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.
 
Werbung:
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.
 
Zurück
Oben