Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Kreuztabelle - kein Detail- aber SUM Wert (https://www.delphipraxis.net/122922-kreuztabelle-kein-detail-aber-sum-wert.html)

heri 24. Okt 2008 10:49

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:
 
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
etc. etc.

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

Billa 24. Okt 2008 11:16

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.

mkinzler 24. Okt 2008 11:21

Re: Kreuztabelle - kein Detail- aber SUM Wert
 
Oder ein temporäre Tabelle mit den Monaten, zu welcher man hinzujoint

nahpets 24. Okt 2008 14:07

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

NormanNG 24. Okt 2008 14:15

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:
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
Dann kann man z.B. die Zahlen 1 bis 12 (Monate) so abrufen:
SQL-Code:
select * from dbo.f_table_of_numbers(1,12)

heri 24. Okt 2008 15:32

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 23:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz