Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
erledigt: Im gleichen Select auf berechnete bzw. geänderte Spalte zugreifen
m.grauber
myCSharp.de - Member



Dabei seit:
Beiträge: 345

Themenstarter:

erledigt: Im gleichen Select auf berechnete bzw. geänderte Spalte zugreifen

beantworten | zitieren | melden

Hallo Experten!

Leider habe ich nichts gefunden und weiß auch nicht so recht nach welchem Suchbegriff ich suchen soll.

Ich möchte in einer Abfrage in einer Spalte je nachdem welche Kriterien pro Datensatz erfüllt sind mit geschachtelten CASE WHEN ... END mir Werte ermitteln und mit "AS" in die Spalte "MeinWert" überführen.

Zusätzlich möchte ich weitere Spalten erzeugen, die auf das Ergebnis in "MeinWert" zugreifen sollen und diesen Wert als Ausgang für anderes nutzen sollen.

Ich stelle es mir so vor:

SELECT CASE WHEN .... THEN TableField1 ELSE TableField2 END AS MeinWert, TableField2, TableField3,
CASE WHEN ... THEN MeinWert ELSE 0 AS Ergebnis1,
CASE WHEN ... THEN MeinWert ELSE 0 AS Ergebnis2,
CASE WHEN ... THEN MeinWert ELSE 0 AS Ergebnis3
FROM ....

oder

SELECT CASE WHEN .... THEN TableField1 ELSE TableField2 END AS MeinWert, TableField2, TableField3,
CASE WHEN ... THEN [1] ELSE 0 AS Ergebnis1,
CASE WHEN ... THEN [1] ELSE 0 AS Ergebnis2,
CASE WHEN ... THEN [1] ELSE 0 AS Ergebnis3

Der CASE WHEN, der später MeinWert ermittelt, ist später mehrfach verschachtelt und sollte daher nur 1x berechnet werden. Da ich mit den Spalten Ergebnis1 - 3 mehrfach darauf zugreifen möchte will ich den SQL-Befehl schnell und kurz halten.

Wie kann ich nun auf die 1. errechnete Spalte "MeinWert" zugreifen? Das klappt weder mit dem mit "AS" generierten Spaltennamen noch mit der Spaltennummer [1] die z. B. bei der Sortierung angegeben werden kann.

Später kommt zu allem "Übel" auch noch eine Gruppierungsfunktion über die Ergebnisse dazu, daher sollte die Lösung recht einfach sein.

Danke und gute Arbeit!

SQL-Server ab 2008
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von m.grauber am .
Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3627
Herkunft: Hannover

beantworten | zitieren | melden

Moin,

das lässt sich über Common Table Expressions (CTEs) lösen (https://docs.microsoft.com/de-de/sql/t-sql/queries/with-common-table-expression-transact-sql?view=sql-server-2017).

Z.B.

WITH Bla AS
(
  SELECT
    CASE WHEN x = y THEN 1 ELSE 0 END AS Wert1
    CASE WHEN y = z THEN 1 ELSE 0 END AS Wert2
  FROM Tabelle
)
SELECT * FROM Bla
WHERE Wert1 = 0

Gruß
Khalid
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
m.grauber
myCSharp.de - Member



Dabei seit:
Beiträge: 345

Themenstarter:

beantworten | zitieren | melden

Hallo Khalid!

Tausend Dank für die super schnelle und präzise Info! Klappt super!

Woher ihr das immer wisst...

Ich hätte nie nach CTE gegoogled.

Noch eine wirklich erfolgreiche Rest-Woche!
Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2354

beantworten | zitieren | melden

Eine weitere Möglichkeit wären noch Sub-Selects ala

SELECT * 
FROM (
    SELECT
        CASE WHEN x = y THEN 1 ELSE 0 END AS Wert1,
        CASE WHEN y = z THEN 1 ELSE 0 END AS Wert2
    FROM Tabelle
) WHERE Wert1 = 0
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers