Jüngste Eintrag + weitere Wert auslesen

pyromelana

Benutzer
Beiträge
6
Hallo,
ich habe folgende Tabelle STUNDENSAETZE(Ausschnitt beispielhaft): Ich möchte als Ergebnis die KST (Kostenstelle), das aktuellste Datum und den Stundensatz haben. Die Tabelle ist groß mit knapp 600 Zeilen

KST || DATUM || STUNDENSATZ
....
1 2006-06-21 00:00:00.000 65
1 2006-06-15 00:00:00.000 55
1 2006-06-15 00:00:00.000 55
1 2006-06-15 00:00:00.000 55
1 2006-06-21 00:00:00.000 25
2 2006-06-15 00:00:00.000 100
2 2006-09-26 00:00:00.000 75
2 2006-06-15 00:00:00.000 108,75
2 2006-06-15 00:00:00.000 117,5
2 2006-06-15 00:00:00.000 135
2 2006-06-15 00:00:00.000 65
.....

Also in der Form
1 2006-06-21 00:00:00.000 65
2 2006-09-26 00:00:00.000 75

also in der Form bzw das Ziel ist halt je eine Kostenstelle (also 1,2,3,4,5,6...) mit dem dazugehörigen Stundensatz -

SELECT KST, MAX(DATUM), STUNDENSATZ
FROM STUNDENSAETZE
group by KST, STUNDENSATZ

... trotzdem spuckt mir die Abfrage viel zu viele Werte aus

Kann mir jemand helfen bzw. zumindest einen Anstoß geben?
 
Werbung:
So werden alle Stundensätze die da sind ausgegeben. Steht da: group by ..STUNDENSATZ, das Ergebnis von Group By ist immer die Ausgabe aller eindeutigen Werte.
Du musst erst das Maximum des Datums je Kostenstelle finden und darüber dann den dort gültigen Stundensatz.
 
SELECT KST,max(DATM) as Datum
FROM dbo.STUNDENSAETZE
group by KST
order by KST desc

Hurra, jetzt zeigt die Abfrage jeweils eine Kostenstelle (1-17) an. Aber ohne den Satz selber. Mache ich noch den Stundensatz hinzu, gibt es wieder

SELECT KST,max(DATM) as Datum,Stundensatz
FROM dbo.STUNDENSAETZE
group by KST, Stundensatz
order by KST desc

Und jetzt steh ich voll aufm Schlauch. Lasse ich den Stundensatz im Group by weg, sind es wieder viel zu viele werte. ein Max (Stundensatz) oder ähnlich Einschränkung kann ich nicht verwenden, da diese sowohl gestiegt, als auch gefallen sind.
 
Du musst Dir klar machen, dass es keine "einzelne" Abfrage mehr ist. (Mmh, es ist immer noch eine Abfrage, aber sie besteht aus 2 Schritten)
Das Ergebnis der ersten Abfrage joinst Du mit dem Datenbestand, um den jeweils passenden Stundensatz rauszuziehen. Versuch mal.
"Gib mir die vollständigen Datensätze oder Stundensätze, wo die Kostenstelle gleich der gefundenen Kostenstelle ist und das Datum gleich dem gefunden Maximum Datum."
 
Select KST, Stundensatz
from dbo.STUNDENSAETZE
outer join dbo.STUNDENSAETZE_1 ON KST = KST_1
where (SELECT KST,max(DATUM) as Datum,Stundensatz
FROM dbo.STUNDENSAETZE)

?

Ich wurschtel gerade rum, hab es aber noch nicht zum Laufen gebracht. Falls erforderlich hier mal der Original SQL

TEIL1
SELECT KOSTENSTELLEN_ID,max(GUELTIG_AB) as GUELTIG_AB
FROM dbo.KALK_WERTE_KST
group by KOSTENSTELLEN_ID


TEIL2
select KOSTENSTELLEN_ID,Ansatz,gueltig_ab
from dbo.KALK_WERTE_KST



... und hier hänge ich
SELECT KOSTENSTELLEN_ID,Ansatz, GUELTIG_AB
FROM dbo.KALK_WERTE_KST full outer join dbo.KALK_WERTRE_KST on kostenstellen_id = kostenstellen_ID_1
 
Ich hab mal die Daten in eine Tabelle kopiert und ausgewertet:

Code:
edb=*# select kst, datum, satz from pyromelana ;
 kst |       datum        |  satz  
-----+--------------------+--------
   1 | 21-JUN-06 00:00:00 |     65
   1 | 15-JUN-06 00:00:00 |     55
   1 | 15-JUN-06 00:00:00 |     55
   1 | 15-JUN-06 00:00:00 |     55
   1 | 21-JUN-06 00:00:00 |     25
   2 | 15-JUN-06 00:00:00 |    100
   2 | 26-SEP-06 00:00:00 |     75
   2 | 15-JUN-06 00:00:00 | 108.75
   2 | 15-JUN-06 00:00:00 |  117.5
   2 | 15-JUN-06 00:00:00 |    135
   2 | 15-JUN-06 00:00:00 |     65
(11 rows)

edb=*# with tmp as (select kst, max(datum), min(satz), max(satz) from pyromelana group by kst) select * from tmp order by kst;
 kst |        max         | min | max
-----+--------------------+-----+-----
   1 | 21-JUN-06 00:00:00 |  25 |  65
   2 | 26-SEP-06 00:00:00 |  65 | 135
(2 rows)

edb=*#

Welchen Wert von satz möchtest Du nun?
 
Welchen Wert von satz möchtest Du nun?
... ich habe eine Tabelle in der Tätigkeiten (Fräsen, Zimmerei, etc) drin sind. Diese mit nur der jeweiligen Kostenstellen_ID. In der zweiten Tabelle (über die wir hier eigentlich schreiben) sind zig Stundensätze der jeweiligen Kostenstellen_IDs mit dem antsprechenden Gültig ab - Datum drin. Ich versuche jetzt zu den Tätigkeiten den entsprechenden gültigen Stundensatz zu ermitteln. Dies als Hintergrund. Daher brauche ich das jünste/höchste (Max) Datum mit der Kostenstellen_ID. In der gleichen Abfrage den Stundensatz anzeigen zu lassen funktioniert nicht (SQL verlangt den Group by...), also muss die Verschachtelung her...
 
Dann sind Deine Daten aber schon offensichtlich Gülle, weil für Kostenstelle 1 für den 2006-06-21 hast Du 2 unterschiedliche Preise. Daher auch die Frage: welchen davon willst Du?
 
Dann sind Deine Daten aber schon offensichtlich Gülle, weil für Kostenstelle 1 für den 2006-06-21 hast Du 2 unterschiedliche Preise. Daher auch die Frage: welchen davon willst Du?
... HAHA.... hab ich meine Chef auch gerade drauf aufmerksam gemacht - und schon wurde die Gesichtsfarbe anders, er schaue sich das an und ich beschäftige mich mit anderen Dingen

Vielen Dank soweit aber mal!
 
tja, sowas ließe sich elegant mit einem EXCLUSION CONSTRAINT vermeiden. Demo:

Code:
edb=*# create table preise(kostenstelle int, von_bis daterange, preis int, exclude using gist(kostenstelle with =, von_bis with &&));
CREATE TABLE
edb=*# insert into preise values (1, '[2020-01-01,2020-02-01)',10);
INSERT 0 1
edb=*# insert into preise values (2, '[2020-01-01,2020-02-01)',10);
INSERT 0 1
edb=*# insert into preise values (2, '[2020-01-15,2020-02-15)',15);
FEHLER:  kollidierender Schlüsselwert verletzt Exclusion-Constraint »preise_kostenstelle_von_bis_excl«
DETAIL:  Schlüssel (kostenstelle, von_bis)=(2, [15-JAN-20,15-FEB-20)) kollidiert mit vorhandenem Schlüssel (kostenstelle, von_bis)=(2, [01-JAN-20,01-FEB-20)).
edb=*# insert into preise values (2, '[2020-02-15,)',25);
INSERT 0 1
edb=*# select * from preise;
 kostenstelle |        von_bis        | preis
--------------+-----------------------+-------
            1 | [01-JAN-20,01-FEB-20) |    10
            2 | [01-JAN-20,01-FEB-20) |    10
            2 | [15-FEB-20,)          |    25
(3 rows)

edb=*#

Der Versuch, für einen überlappenden Zeitraum einen zweiten Preis einzugeben, scheitert. Der letzte Datensatz ist nach oben offen, auch das geht.
 
Wie auch immer... jetzt gehts weiter, zumal das Ergebnis aus Anlauf 1 genau 17 Kostenstellen ausspuckt (so muss es auch sein):

Code:
SELECT        MAX(GUELTIG_AB) AS Datum, KOSTENSTELLEN_ID
FROM            dbo.KALK_WERTE_KST
GROUP BY KOSTENSTELLEN_ID

Nun muss ich nur noch (idealerweise in der gleichen Abfrage) die Kostenstelle und das Datum verbinden, dass ich mir den Stundensatz dazu ausgeben kann.

so geht es nicht, hier bekomme ich den Stundensatz nicht eindeutig angezeigt; aus 17 Werten werden wieder über 130... .ANSATZ ist der float - Wert des Stundensatzes
Code:
SELECT        MAX(dbo.KALK_WERTE_KST.GUELTIG_AB) AS Datum, dbo.KALK_WERTE_KST.KOSTENSTELLEN_ID, dbo.KALK_WERTE_KST.ANSATZ
FROM            dbo.KALK_WERTE_KST INNER JOIN
                         dbo.KALK_WERTE_KST AS KALK_WERTE_KST_1 ON dbo.KALK_WERTE_KST.KOSTENSTELLEN_ID = KALK_WERTE_KST_1.KOSTENSTELLEN_ID AND
                         dbo.KALK_WERTE_KST.GUELTIG_AB = KALK_WERTE_KST_1.GUELTIG_AB
GROUP BY dbo.KALK_WERTE_KST.KOSTENSTELLEN_ID, dbo.KALK_WERTE_KST.ANSATZ
 
Werbung:
Es ist technisch das gleiche Problem, wie in Deiner Eingangsfrage.
Was Du ins Group By schreibst, wird auch eindeutig gruppiert.
Die Lösung ist auch die gleiche.
 
Zurück
Oben