AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Kreuztabelle - kein Detail- aber SUM Wert
Thema durchsuchen
Ansicht
Themen-Optionen

Kreuztabelle - kein Detail- aber SUM Wert

Ein Thema von heri · begonnen am 24. Okt 2008 · letzter Beitrag vom 24. Okt 2008
Antwort Antwort
heri

Registriert seit: 20. Mär 2006
81 Beiträge
 
Delphi 2006 Enterprise
 
#1

Kreuztabelle - kein Detail- aber SUM Wert

  Alt 24. Okt 2008, 10:49
Datenbank: MSSQL • Version: 2000 • Zugriff über: ADO
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
  Mit Zitat antworten Zitat
Benutzerbild von Billa
Billa

Registriert seit: 11. Aug 2003
237 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Kreuztabelle - kein Detail- aber SUM Wert

  Alt 24. Okt 2008, 11:16
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.
Gruß Billa

Nur weil ich paranoid bin, heißt das nicht, daß die da draussen nicht hinter mir her sind....
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Kreuztabelle - kein Detail- aber SUM Wert

  Alt 24. Okt 2008, 11:21
Oder ein temporäre Tabelle mit den Monaten, zu welcher man hinzujoint
Markus Kinzler
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

Re: Kreuztabelle - kein Detail- aber SUM Wert

  Alt 24. Okt 2008, 14:07
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, 'Janas Monat
    union all
    select 2, 'Febas Monat
    union all
    select 3, 'Mrzas Monat
    union all
    select 4, 'Apras Monat
    union all
    select 5, 'Mayas Monat
    union all
    select 6, 'Junas Monat
    union all
    select 7, 'Julas Monat
    union all
    select 8, 'Augas Monat
    union all
    select 9, 'Sepas Monat
    union all
    select 10, 'Oktas Monat
    union all
    select 11, 'Novas Monat
    union all
    select 12, 'Dezas Monat
) b
on a.Mo = b.Mo
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Kreuztabelle - kein Detail- aber SUM Wert

  Alt 24. Okt 2008, 14:15
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:
select * from dbo.f_table_of_numbers(1,12)
Gruß
Norman
  Mit Zitat antworten Zitat
heri

Registriert seit: 20. Mär 2006
81 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: Kreuztabelle - kein Detail- aber SUM Wert

  Alt 24. Okt 2008, 15:32
Vielen Dank für die Inputs!

Die Lösung mit der UDF gefällt mir persönlich am besten!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 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