Abfrage mit SELECT (Unterbedingung) in WHERE

thomar78

Benutzer
Beiträge
8
Hallo, ich habe hier ein Problem mit der Erstellung einer Abfrage.
Eigentlich erscheint mir die Bedingung sehr einfach, aber ich bekomme ständig eine Fehlermeldung, die ich mir nicht erklären kann...

Die Tabelle hat im Grunde nur 3 Spalten

No, YYYYMM, Value
2116 201704 500
2116 201705 1000
2116 201706 1000
2116 201707 750

Die Abfrage gibt die No und YYYYMM als Parameter vor und liefert Value zurück. Sollte der übergebene Wert für den Parameter YYYYMM nicht gefunden werden soll der Value Wert geliefert werden, bei dem YYYYMM für No am größten ist.

Ich habe es mit CASE WHEN in der WHERE Bedingung versucht, bekomme aber den Fehler:
Fehlerquelle: .Net SqlClient Data Provider
Fehlermeldung: Parameter 4 ([DBName].[].[unknown]): The CLR Type does not exist or you do not have permissions to access it.

SELECT Value, YYYYMM
FROM tb1
WHERE (No = @No) AND (YYYYMM = CASE WHEN YYYYMM = @YYYYMM THEN YYYYMM ELSE
(SELECT MAX(YYYYMM)
FROM tb1
WHERE No = @No) END)

Kann mir jemand sagen, wo mein Fehler liegt, oder mir auf Grund des hier geschilderten Beispiels sagen, wie die Abfrage auszusehen hat?

Vielen Dank vorab...
 
Werbung:
Ich bin mir nicht sicher, CASE habe ich im WHERE-Teil eigentlich noch nie benutzt. Es liegt entweder daran oder an den Variablen, @No und @YYYYMM existieren? Womit machst du die Abfrage und kannst du die Variablen gegen harte Werte tauschen und dann läuft es?

Vielleicht muss auch deine Spalte aus dem Subselect einen Namen haben:
Code:
SELECT Value, YYYYMM
FROM tb1
WHERE (No = @No) AND (YYYYMM = CASE WHEN YYYYMM = @YYYYMM THEN YYYYMM ELSE
(SELECT MAX(YYYYMM) AS YYYYMM
FROM tb1
WHERE No = @No) END)
 
Hallo, danke für die Rückmeldung. Es liegt an der Variable @YYYYMM. Sobald ich hier einen harten Wert eintrage, läuft die Abfrage korrekt. Der Versuch der Spalte im Subselect einen Namen zu geben führt zum selben Fehler.
Ist meine Denke falsch? Würde man so eine Abfrage von der Struktur anders aufbauen?
 
Werbung:
Hallo, das Problem war eigentlich zweigeteilt. Die Fehlermeldung kommt, egal wie ich die Variablen deklariere. Das Fenster zur Konfiguration der Datenquelle im VS2015 bringt den Fehler mit CLR Type immer. Es scheint an dem Zeichen '<' vor der @Period Variable zu liegen. Im fertigen SQLDataSource Element in der aspx Seite werden diese als '&lt;' ausgegeben. Führe ich die Testabfrage (nicht im Designer) dann aus, bekomme ich korrekte Ergebnisse mit dem folgenden SELECT:

SELECT Value FROM tb1 WHERE (No = @No) AND (YYYYMM = (SELECT CASE WHEN EXISTS (SELECT YYYYMM FROM tb1 WHERE (No = @No) AND (YYYYMM = @Period)) THEN @Period WHEN EXISTS (SELECT MAX(YYYYMM) FROM tb1 WHERE (No = @No) AND (YYYYMM < @Period)) THEN (SELECT MAX(YYYYMM) FROM tb1 WHERE (No = @No) AND (YYYYMM < @Period)) ELSE 'einen Wert den es definitiv nicht gibt für YYYYMM' END AS Expr1))

Das einzige Problem welches ich nun habe ist:

gebe ich einen Wert für @Period ein für welchen es keinen Eintrag kleiner @Period gibt bekomme ich NULL zurück. Ich habe es noch nicht geschafft, dass mir dann 0 zurückgegeben wird.
Wenn da jemand Rat weiß...
 
Zurück
Oben