Summe von Datumswerten

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

wagnbeu0
**
Beiträge: 47
Registriert: Fr, 23.04.2010 10:56

Summe von Datumswerten

Beitrag von wagnbeu0 »

Hallo, in meiner HSQL-DB gibt es ein Feld:
Datum = date
Thema = number

Ich will jetzt folgende Auswertung bekommen:

Code: Alles auswählen

Jahr      2008    2009  2010   2011
Thema
1           1         1       2        1 
2           3         4       2        1
3           1         2       3        1
Ich will also festellen, wie oft wurde welches Thema in welchem Jahr als gespeichert, und hier eine Summe erhalten. Die Datumsangaben liegen im Format DD.MM.YYYY vor, es müsste also auf YYYY zurückgestutzt werden.
Kann ich diese AUfgabe mit HSQLDB lösen?
AndreasJBittner
*****
Beiträge: 473
Registriert: Fr, 09.10.2009 16:44
Wohnort: Bielefeld
Kontaktdaten:

Re: Summe von Datumswerten

Beitrag von AndreasJBittner »

Hallo,

ja, kannst Du.

SELECT Count(Thema), <Datum> FROM <Tabelle> WHERE YEAR(<Datum>) BETWEEN 2008 AND 2011 GROUP BY YEAR(<Datum>)

könnte funktionieren, hab ich jetzt nicht ausprobiert.

Grüße
Andreas
LO 4.3
AMD Athlon 64 3700+, 2.21 GHz, 4 GB RAM, Win XP SP3
iMac 2 GHz, 16 GB RAM/MacBookPro, 8 GB RAM, Mac OS X 10.9.5
Intel Core2 Quad CPU Q6600 @ 2,4 GHz, 4 GB RAM, Suse 13.2

MySQL 5.1: Pentium III, 666 MHz, 512 MB, Suse 12.1
pmoegenb
********
Beiträge: 4330
Registriert: Di, 22.06.2004 12:02
Wohnort: 71134 Aidlingen
Kontaktdaten:

Re: Summe von Datumswerten

Beitrag von pmoegenb »

Code: Alles auswählen

SELECT YEAR(Datum) AS Jahr, COUNT(Thema) AS Thema
GROUP BY YEAR(Datum), Thema
ORDER BY YEAR(Datum), Thema
Gruß

Peter
---------------------------------------------------------------------------
Windows 7 Prof. 64-bit SP1, LibreOffice 4.3.6.2 und AOO 4.1.1
pmoegenb
********
Beiträge: 4330
Registriert: Di, 22.06.2004 12:02
Wohnort: 71134 Aidlingen
Kontaktdaten:

Re: Summe von Datumswerten

Beitrag von pmoegenb »

pmoegenb hat geschrieben:

Code: Alles auswählen

SELECT YEAR(Datum) AS Jahr, COUNT(Thema) AS Thema
FROM Tabelle
GROUP BY YEAR(Datum), Thema
ORDER BY YEAR(Datum), Thema
Gruß

Peter
---------------------------------------------------------------------------
Windows 7 Prof. 64-bit SP1, LibreOffice 4.3.6.2 und AOO 4.1.1
pmoegenb
********
Beiträge: 4330
Registriert: Di, 22.06.2004 12:02
Wohnort: 71134 Aidlingen
Kontaktdaten:

Re: Summe von Datumswerten

Beitrag von pmoegenb »

pmoegenb hat geschrieben:

Code: Alles auswählen

SELECT YEAR(Datum) AS Jahr, COUNT(Thema) AS Thema
GROUP BY YEAR(Datum), Thema
ORDER BY YEAR(Datum), Thema
Quatsch, siehe nachfolgend
Gruß

Peter
---------------------------------------------------------------------------
Windows 7 Prof. 64-bit SP1, LibreOffice 4.3.6.2 und AOO 4.1.1
wagnbeu0
**
Beiträge: 47
Registriert: Fr, 23.04.2010 10:56

Re: Summe von Datumswerten

Beitrag von wagnbeu0 »

Hallo,

danke für die Antworten, aber ein reines group-by bringt mich hier nicht weiter. Das Formular, dass ich nachbilden möchte/muss, bildet in der horizontalen die Jahre, in der vertikelen die Summe der Themen, also so wie im Beispiel.
Eine Möglichkeit wäre der EInsatz des Datenpiloten, wobei ich hier wieder ein extra Formular machen müsste, ich das ganze aber als Query zur Verfügung stellen muss.
AndreasJBittner
*****
Beiträge: 473
Registriert: Fr, 09.10.2009 16:44
Wohnort: Bielefeld
Kontaktdaten:

Re: Summe von Datumswerten

Beitrag von AndreasJBittner »

Hallo,

also brauchst Du die Zeilen- UND Spaltensummen?

Grüße
Andreas
LO 4.3
AMD Athlon 64 3700+, 2.21 GHz, 4 GB RAM, Win XP SP3
iMac 2 GHz, 16 GB RAM/MacBookPro, 8 GB RAM, Mac OS X 10.9.5
Intel Core2 Quad CPU Q6600 @ 2,4 GHz, 4 GB RAM, Suse 13.2

MySQL 5.1: Pentium III, 666 MHz, 512 MB, Suse 12.1
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Summe von Datumswerten

Beitrag von DPunch »

Aloha

Mit der Holzhammer-Methode kann man das per SQL so

Code: Alles auswählen

SELECT
Thema,
SUM((SELECT COUNT(*) FROM meineTabelle WHERE ID = a.ID AND YEAR(Datum) = 2007 )) "2007",
SUM((SELECT COUNT(*) FROM meineTabelle WHERE ID = a.ID AND YEAR(Datum) = 2008 )) "2008",
SUM((SELECT COUNT(*) FROM meineTabelle WHERE ID = a.ID AND YEAR(Datum) = 2009 )) "2009",
SUM((SELECT COUNT(*) FROM meineTabelle WHERE ID = a.ID AND YEAR(Datum) = 2010 )) "2010",
SUM((SELECT COUNT(*) FROM meineTabelle WHERE ID = a.ID AND YEAR(Datum) = 2011 )) "2011"
FROM meineTabelle a
GROUP BY Thema
ORDER BY Thema
machen.
Eine elegantere Lösung fällt mir dazu im Moment nicht ein.
wagnbeu0
**
Beiträge: 47
Registriert: Fr, 23.04.2010 10:56

Re: Summe von Datumswerten

Beitrag von wagnbeu0 »

Ja, genau diese Lösung brauche ich. So eine Holzhammer-Methode war mir auch eingefallen, aber ich habe gehofft, dass es dazu mittlerweile etwas eleganteres gibt.
wagnbeu0
**
Beiträge: 47
Registriert: Fr, 23.04.2010 10:56

Re: Summe von Datumswerten

Beitrag von wagnbeu0 »

So, da bin ich nochmals: Ein Problem habe ich nun noch mit Joins:
Ich habe zwei Tabellen:

Themenliste
Nummer varchar
Thema varchar
Inhalt sind hier ca. 200 Themen.

Themenplan:
Thema varchar
datum date

Mittels des o.g. Befehls erhalte ich eine Liste, wie oft welcher Vortrag pro Jahr gehalten wurde. Leider zeigt er mir nun nur Vorträge an, die auch bereits gehalten wurden. Vorträge, die noch nicht gehalten wurden, zeigt er mir nicht an, die müssen aber in die Übersicht bzw. Abfrage noch rein.

Wie muss ich nun die abfrage durch Joins erweitern, damit er auch die Vorträge anzeigt, die in den ausgewählten Jahren NICHT gehalten wurde, also keinen Eintrag im Feld Datum haben? Ich komme hier mit der Syntax nicht mehr weiter...
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Summe von Datumswerten

Beitrag von Barlee »

Hallo wagnbeu0,

Code: Alles auswählen

SELECT * FROM "Themenliste" LEFT JOIN "Themenplan" ON "Themenliste"."Thema" = "Themenplan"."Thema"
Ggf. SQL direkt ausführen aktivieren!

Gruß Barlee
wagnbeu0
**
Beiträge: 47
Registriert: Fr, 23.04.2010 10:56

Re: Summe von Datumswerten

Beitrag von wagnbeu0 »

Nö, kriege ich nicht hin:
Ich bekomme zwar nun eine Summer aller Vorträge, auch wenn noch nie gehalten, aber die Auflistung, in welchem Jahr wie oft, daran scheitere ich schon wieder. Das mit den Joins bringt mich durcheinander:

Ich brauche zuerst eine Auflistung aller Vorträge, dann die Auswertung, wie oft in einem Jahr gehalten.

Diese Syntax bringt falsche Werte:

Code: Alles auswählen

SELECT "b"."Vortrag", "a"."Thema", 
SUM( ( SELECT COUNT( * ) FROM  "Vortragsthemen" as "a" LEFT JOIN "Vortragsplan" as "b" ON "a"."Nummer" = "b"."Vortrag" WHERE "ID" = "b"."ID" AND YEAR( "Datum" ) = 2009 ) ) AS "2009", 
SUM( ( SELECT COUNT( * ) FROM "Vortragsthemen" as "a" LEFT JOIN "Vortragsplan" as "b" ON "a"."Nummer" = "b"."Vortrag" WHERE "ID" = "b"."ID" AND YEAR( "Datum" ) = 2010 ) ) AS "2010", 
SUM( ( SELECT COUNT( * ) FROM  "Vortragsthemen" as "a" LEFT JOIN "Vortragsplan" as "b" ON "a"."Nummer" = "b"."Vortrag" WHERE "ID" = "b"."ID" AND YEAR( "Datum" ) = 2011 ) ) AS "2011",
SUM( ( SELECT COUNT( * ) FROM  "Vortragsthemen" as "a" LEFT JOIN "Vortragsplan" as "b" ON "a"."Nummer" = "b"."Vortrag" WHERE "ID" = "b"."ID" AND YEAR( "Datum" ) = 2012 ) ) AS "2012" 
FROM "Vortragsthemen" as "a" LEFT JOIN "Vortragsplan" as "b" ON "a"."Nummer" = "b"."Vortrag" 
GROUP BY "b"."Vortrag", "a"."Thema" 
ORDER BY "b"."Vortrag" ASC
wagnbeu0
**
Beiträge: 47
Registriert: Fr, 23.04.2010 10:56

Re: Summe von Datumswerten

Beitrag von wagnbeu0 »

Okay, ich habe es nun geschafft:

Code: Alles auswählen

SELECT "E"."Nummer","F"."Thema","E"."2009","E"."2010","E"."2011","E"."2012"
from 
(SELECT "a"."Nummer",
SUM( ( SELECT COUNT( * ) FROM "Vortragsplan" WHERE "ID" = "a"."ID" AND YEAR( "Datum" ) = 2009 AND "Zielort" = 'Muenchen') ) AS "2009", 
SUM( ( SELECT COUNT( * ) FROM "Vortragsplan" WHERE "ID" = "a"."ID" AND YEAR( "Datum" ) = 2010 AND "Zielort" = 'Muenchen') ) AS "2010", 
SUM( ( SELECT COUNT( * ) FROM "Vortragsplan" WHERE "ID" = "a"."ID" AND YEAR( "Datum" ) = 2011 AND "Zielort" = 'Muenchen') ) AS "2011", 
SUM( ( SELECT COUNT( * ) FROM "Vortragsplan" WHERE "ID" = "a"."ID" AND YEAR( "Datum" ) = 2012 AND "Zielort" = 'Muenchen') ) AS "2012" 
FROM 
(select * from "Vortragsplan" RIGHT JOIN "Vortragsthemen" ON "Vortragsthemen"."Nummer" = "Vortragsplan"."Vortrag") AS "a"
group by "a"."Nummer"
) as "E", "Vortragsthemen" as "F"
where "E"."Nummer" = "F"."Nummer"
ORDER BY "E"."Nummer" ASC;
Ich konnte mich erinnern, dass ich in der Arbeit schon mehrmals Subabfragen machen musste, damit das sauber klappt. Jetzt bekomme ich genau den BEricht, denn ich wollte. Danke nochmals!!!
Antworten