In Rechnung gestellte Gebühren pro Jahr zählen

lapadula

Aktiver Benutzer
Beiträge
33
Hallo ich brächte Hilfe bei einer SQL-Abfrage.
Es geht darum herauszufinden, welche Gebühr, wie oft, in welchem Jahr in Rechnung gestellt wurde (der letzten 8 Jahre + das aktuell laufende Jahr).

Ich habe folgende Tabellen:
  • tbl_Gebuehr
  • tbl_Abrechnung : FK = tbl_Gebuehr_ID

Momentan habe ich 2 SQL Abfragen

Mit dem foldenden Befehl ermittele ich erst, welche Gebühren tatsächlich in Rechnung gestellt wurden:

select
A.tblxx_Gebuehr_ID,
(select Bezeichnung from tbl_Gebuehr where ID = A.tbl_Gebuehr_ID) as Bezeichnung
from
tbl_Abrechnung A
LEFT JOIN tbl_Gebuehr G ON A.tbl_Gebuehr_ID = G.ID
where
(year(A.CreateDate) >= 2011 AND year(A.CreateDate) <= 2019)
group by
A.tbl_Gebuehr_ID

Danach muss ich aber mühsam alle IDs aus der Ersten Abfrage durchgehen und in in die folgende Abfrage einfügen

select
year(A.CreateDate) as Jahr,
Count(year(A.CreateDate)) as Anzahl
from
tbl_Abrechnung A
where
tbl_Gebuehr_ID = 185 AND
(year(CreateDate) >= 2011 AND year(CreateDate) <= 2019)
Group By
year(A.CreateDate)
order by
year(A.CreateDate)

Ich komme nicht drauf, wie ich das in einen Befehl verpacken kann.
 
Werbung:
wenn Du mal die Tabellen zeigen würdest (create table), mit einigen Demodaten (insert into ...) und was bei rauskommen soll (nachvollziehbar), dann wäre Hilfe leichter möglich.
 
Okay, hier die Tabellen (verkürzt) und was rauskommen soll :

create table tbl_Abrechnung
(
ID INT IDENTITY(1,1),
CreateDate datetime null,
tbl_Gebuehr_ID int null,
tbl_Gebuer_ID int FOREIGN KEY REFERENCES tblxx_Gebuehr(ID)
);

create table tbl_Gebuehr
(
ID INT IDENTITY(1,1),
Bezeichnung varchar(max) not null,
Betrag float not null
);

Folgendes soll rauskommen:
-- | Jahr | Anzahl | Gebuerbezeichnung | Betrag | tbl_Gebuehr_ID |
----------------------------------------------------------------------
-- | 2011 | 10 | Bearbeitungsgebühr A | 50 | 170 |
-- | 2012 | 15 | Bearbeitungsgebühr A | 50 | 170 |
-- | 2013 | 20 | Bearbeitungsgebühr A | 50 | 170 |
-- | 2014 | 30 | Bearbeitungsgebühr A | 50 | 170 |
-- | 2015 | 40 | Bearbeitungsgebühr A | 50 | 170 |
-- | 2016 | 50 | Bearbeitungsgebühr A | 50 | 170 |
-- | 2017 | 55 | Bearbeitungsgebühr A | 50 | 170 |
-- | 2018 | 67 | Bearbeitungsgebühr A | 50 | 170 |
-- | 2019 | 99 | Bearbeitungsgebühr A | 50 | 170 |
nächste Gebühr
-- | 2011 | 18 | Bearbeitungsgebühr B | 79 | 115 |
-- | 2012 | 23 | Bearbeitungsgebühr B | 79 | 115 |
-- | 2013 | 14 | Bearbeitungsgebühr B | 79 | 115 |
-- | 2014 | 55 | Bearbeitungsgebühr B | 79 | 115 |
-- | 2015 | 64 | Bearbeitungsgebühr B | 79 | 115 |
-- | 2016 | 89 | Bearbeitungsgebühr B | 79 | 115 |
-- | 2017 | 47 | Bearbeitungsgebühr B | 79 | 115 |
-- | 2018 | 59 | Bearbeitungsgebühr B | 79 | 115 |
-- | 2019 | 10 | Bearbeitungsgebühr B | 79 | 115 |

Habe nun den folgenden Befehl geschrieben:

select
year(A.CreateDate) as Jahr,
count(year(A.CreateDate)) as Anzahl,
(Select Bezeichnung from tbl_Gebuehr where ID = A.tbl_Gebuehr_ID) as Gebuehrbezeichnung,
(Select Betrag from tblxx_Gebuehr where ID = A.tbl_Gebuehr_ID) as Betrag,
A.tbl_Gebuehr_ID
from
tbl_Gebuehr G
LEFT Join tbl_Abrechnung A ON A.tbl_Gebuehr_ID = G.ID
where
(A.CreateDate >= (year(getdate()) -8))
group by
year(A.CreateDate),
A.tbl_Gebuehr_ID
order by
Gebuehrbezeichnung,
year(A.CreateDate)

Würde gerne dafür feedback bekommen, ob ich da evtl. einen Denkfehler habe oder wo man es noch verbessern könnte bzgl. Performance.
 
Werbung:
Schwer zu sagen wo dein Denkfehler liegt, ist schon ein bischen chaotisch. Vermutlich hast du GROUP BY nicht richtig verstanden (ist im ersten Select auch syntaktisch falsch) und kann nicht nur nach einer sondern mehreren Spalten gruppieren.
Code:
SELECT   A.tblxx_Gebuehr_ID AS GebuehrID,
       G.Bezeichnung,
       datepart(year,A.CreateDate) AS Jahr,
       count(*) AS Anzahl
FROM   tbl_Abrechnung A
LEFT JOIN tbl_Gebuehr G
ON   A.tbl_Gebuehr_ID = G.ID
WHERE   datepart(year,A.CreateDate) BETWEEN 2011 AND 2019
GROUP BY A.tblxx_Gebuehr_ID,G.Bezeichnung,datepart(year,A.CreateDate)
 
Zurück
Oben