Sql-problem

hallo,

ich habe gerade einen knoten im hirn.
folgender fall:

select id, datestate, value from kalk where vertrag_id = 4576

ich bekomme für dieses sql 2 datensätze zurück.
jetzt soll folgende logik eingebaut werden – wenn das datum der datensätze gleich ist UND der wert value summiert, eine positive zahl ergibt, soll der datensatz ausgegeben werden, ansonsten nicht.

kann mir jemand auf die sprünge helfen?

gruß

rasta

Hallo,

also erstmal generell: Wenn du da schon mehrere Einträge bekommst (vertrags_id hört sich jetzt mal nach einem Primärschlüssl an), dann solltest du dein DB-Konzept nochmal überarbeiten, da du anscheinend nicht Redundanz und Anomalie frei bist.

Ansonsten würde ich die Abfrage ob das Datum das selbe ist usw. und die darauffolgende Ausgabe bzw. nicht-Ausgabe nicht im SQL-Statement machen. Das kannst du ja problemlos schnell im Programmcode einbauen. Dürfte von der Performance eh schneller sein und eine Datenbankabfrage hast du so oder so…

Gruß
Johannes

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hallo johannes,

zunächst danke für deine antwort. vertrag_id ist nicht der primärschlüssel der tabelle „kalk“.
ein vertrag(id) kann beliebig viele kalkulationen enthalten.

wenn das datum der zurückgegebenen kalkulationen gleich ist, soll der wert value summiert und nur ausgegeben werden, wenn dieser positiv ist.

dies müsste sich durch subselect und selectCase lösen lassen –

und generell gibt es für diese datenbank meines wissens kein konzept. alles liegt kreuz und quer – namenskonventionen, was ist das?
das anwendungssystem wurde eingekauft, deswegen kann und werde ich nicht an der db rumschrauben(benötige aber trotzdem auswertungen…)

also erstmal generell: Wenn du da schon mehrere Einträge
bekommst (vertrags_id hört sich jetzt mal nach einem
Primärschlüssl an), dann solltest du dein DB-Konzept nochmal
überarbeiten, da du anscheinend nicht Redundanz und Anomalie
frei bist.

Ansonsten würde ich die Abfrage ob das Datum das selbe ist
usw. und die darauffolgende Ausgabe bzw. nicht-Ausgabe nicht
im SQL-Statement machen. Das kannst du ja problemlos schnell
im Programmcode einbauen. Dürfte von der Performance eh
schneller sein und eine Datenbankabfrage hast du so oder so…

bei deiner aussage zur performance kommt es auf die problemstellung an
sicher macht es keinen unterschied wenn ich die folgeverarbeitung im programmcode einbaue, doch wenn ich aufgrund des ergebnisses des sql ein folgesql senden muss?? … dann imho bestimmt nicht…
sofern das sql korrekt aufgebaut ist, ist es auf jedenfall schneller, nur 1ne anfrage über die connection zu schicken, als–> sql senden, verarbeiten, folgesql senden

gruß

rasta

Gruß
Johannes

hallo,

ich habe gerade einen knoten im hirn.
folgender fall:

select id, datestate, value from kalk where vertrag_id = 4576

ich bekomme für dieses sql 2 datensätze zurück.
jetzt soll folgende logik eingebaut werden – wenn das datum
der datensätze gleich ist UND der wert value summiert, eine
positive zahl ergibt, soll der datensatz ausgegeben werden,
ansonsten nicht.

kann mir jemand auf die sprünge helfen?

gruß

rasta

Hallo,
gruppiere nach den gewünschten attributen und summiere die werte auf dann kannst du die having clause verwenden.

z.B. select id, datestate, sum(value) summe from kalk where vertrag_id = 4576 group by id, datestate having summe > 0;

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi!

Also so ganz verstehe ich immer noch nicht, warum du es nicht einfach im Programmcode machen kannst. Eine Abfrage machst du ja so oder so. Das ein Folge-SQL zustande kommt, konnte ich aus deinem Text nicht lesen und kann mir auch grade nicht vorstellen wie man einem solchen aus dem Weg gehen sollte. Aber vielleicht verstehe ich das Problem auch nicht ganz…

Naja, egal. Mit Subselect habe ich mich bisher kaum beschäftigt, aber es könnte vielleicht in dieser Form gehen:

SELECT id, datestate, value
FROM kalk AS k1
WHERE vertrag_id = 4576 ( SELECT id, datestate, value
FROM kalk AS k2
WHERE k2.datestate = k1.datestate AND SUM(value) > 0 );

Also wie gesagt, keine Ahnung ob das so klappen kann. Probier einfach mal aus. Ansonsten hilft dir Google bestimmt auch weiter wenn du nach Subselect suchst :wink:

Gruß
Johannes

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]