![]() |
Datenbank: MSSQL • Version: 2000 • Zugriff über: ADO
Kreuztabelle - kein Detail- aber SUM Wert
In meiner Tabelle habe ich folgende TestDaten
ID │ Datum │ Wert 1 │ 01.Jan.08 │ 100 2 │ 01.Feb.08 │ 100 3 │ 01.Apr.08 │ 100 (Hinweis: für den März gibt es keine Daten!) nun möchte ich aber folgendes Ergebnis mit SQL erhalten: Jan 100 Feb 100 Mrz 0 Apr 100 (Hinweis: mit März 0!) Kein Problem wäre es ja wenn für den März ein Detailwert existieren würde muss ich das Problem wirklich mit folgender (lahmen) PROCEDURE lösen:
SQL-Code:
etc. etc. SELECT 1, SUM(Wert) From Tabelle WHERE MONTH(Datum )=1 UNION SELECT 2, SUM(Wert) From Tabelle WHERE MONTH(Datum )=2 UNION SELECT 3, SUM(Wert) From Tabelle WHERE MONTH(Datum )=3 PS: Es geht hier NICHT um die Frage ob auf dem Report der März einfach wegbleiben darf und am liebsten wäre mir ja ein ISO SQL Lösung |
Re: Kreuztabelle - kein Detail- aber SUM Wert
Da fallen mir gleich ein paar Kleinigkeiten auf:
1. Es scheint sich um Statistik zu handeln. Könnte es sich lohnen, zuerst einen Dummy-Datensatz (Datum 1.März 2008, 0 ) einzufügen und die Abfrage erst danach laufen zu lassen? Natürlich nur, falls es keine zwingenden Gründe dagegen gibt ... 2. Was passiert mit Deiner Abfrage, wenn der der Zeitraum länger als ein Jahr ist? (z.B. 2x März). Sollte nicht die WHERE-Bedingung bzgl. des Jahres erweitert werden? 3. Wenn das ganze in einer SP läuft, kann man auch eine Schleife über alle Monate laufen lassen und innerhalb der Schleife kumulieren. |
Re: Kreuztabelle - kein Detail- aber SUM Wert
Oder ein temporäre Tabelle mit den Monaten, zu welcher man hinzujoint
|
Re: Kreuztabelle - kein Detail- aber SUM Wert
Hallo,
meinst Du sowas?
SQL-Code:
select Monat, IsNull(Wert,0) As Wert from (
select IsNull(sum(IsNull(Wert,0)),0) As Wert, month(datum) as Mo from tabelle where month(datum) in (1,2,4,5,6,9) -- das muss natürlich angepasst werden group by month(datum) ) a right join ( select 1 As Mo, 'Jan' as Monat union all select 2, 'Feb' as Monat union all select 3, 'Mrz' as Monat union all select 4, 'Apr' as Monat union all select 5, 'May' as Monat union all select 6, 'Jun' as Monat union all select 7, 'Jul' as Monat union all select 8, 'Aug' as Monat union all select 9, 'Sep' as Monat union all select 10, 'Okt' as Monat union all select 11, 'Nov' as Monat union all select 12, 'Dez' as Monat ) b on a.Mo = b.Mo |
Re: Kreuztabelle - kein Detail- aber SUM Wert
Hi,
das mit der temp.Tabelle kann man auch sehr nett mittels einer UDF lösen:
SQL-Code:
Dann kann man z.B. die Zahlen 1 bis 12 (Monate) so abrufen:
CREATE FUNCTION dbo.f_table_of_numbers (@min_number int, @max_number int)
RETURNS @t table (number int) AS begin declare @number_of_numbers int set @number_of_numbers = @max_number - @min_number + 1 insert into @t ( number ) values (0) declare @i int set @i = 1 while @i < @number_of_numbers / 2 + 1 begin insert into @t ( number ) select number + @i from @t set @i = @i * 2 end insert into @t ( number ) select number + @i from @t where number + @i < @number_of_numbers update @t set number = number + @min_number return end
SQL-Code:
select * from dbo.f_table_of_numbers(1,12)
|
Re: Kreuztabelle - kein Detail- aber SUM Wert
Vielen Dank für die Inputs!
Die Lösung mit der UDF gefällt mir persönlich am besten! :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz