bluejet
Goto Top

MS SQL: Zwei numeric-Felder in neuem Feld verbinden

Hallo zusammen,


ich melde mich einmal mit einer wahrscheinlich sehr einfachen Sache, bei der ich jedoch gerade etwas hänge...
Es geht um folgendes:

Ich möchte eine View erstellen und in dieser zwei numeric-Felder aus den Quelltabellen miteinander verbinden (Monat und Jahr) .
Diese sollen aber durch einen Punkt getrennt sein und anschließend im Ergebnis so aussehen: 1.2016 (Feld 'Monat'=1 | Feld 'Jahr'=2016)

Hintergrund ist der, dass ich in einem Report auch einen Jahreswechsel miteinschließen kann, sprich sagen kann: [...] where NeuesFeldAusDerView >=9.2015 and <=3.2016
Nur als kleine Info, wofür ich das brauche - mir ist nur dieser Lösungsweg auf die Schnelle eingefallen.
Falls ich hiermit jedoch auf dem Holzweg bin, gerne auch andere Tipps - bin wahrlich kein SQL-Experte, möchte das aber gerne lösen und etwas dazulernen. face-smile


Wäre sehr dankbar, wenn mich hier jemand in die richtige Bahn lenken könnte.


Besten Dank!

Content-ID: 299895

Url: https://administrator.de/contentid/299895

Ausgedruckt am: 24.11.2024 um 06:11 Uhr

BirdyB
BirdyB 23.03.2016 um 11:27:04 Uhr
Goto Top
Hi,

alternativ zum Vorschlag von @114757 könntest du auch mit DATEFROMPARTS() aus Monat und Jahr ein Datum erstellen lassen.
Damit könntest du evtl. auftretende Sortierprobleme vermeiden. (Alphanumerische Sortierung vs. numerische Sortierung / Sortierung nach Datum)
https://msdn.microsoft.com/de-de/library/hh213228(v=sql.120).aspx

Beste Grüße!


Berthold
Biber
Biber 23.03.2016 aktualisiert um 11:52:21 Uhr
Goto Top
Moin bluejet,


Zitat von @Bluejet:
Ich möchte eine View erstellen und in dieser zwei numeric-Felder aus den Quelltabellen miteinander verbinden (Monat und Jahr) .
Diese sollen aber durch einen Punkt getrennt sein und anschließend im Ergebnis so aussehen: 1.2016 (Feld 'Monat'=1 | Feld 'Jahr'=2016)

Hintergrund ist der, dass ich in einem Report auch einen Jahreswechsel miteinschließen kann, sprich sagen kann: [...] where NeuesFeldAusDerView >=9.2015 and <=3.2016
Ganz schlechter Plan.
Wenn du ein künstliches (Text-)Feld so wie skizziert erzeugst, dann bekommst du bei einen Kleiner/größer/between ganz unsinnige ergebnisse.
Bzw. in dem angegebenen Vergleich einen leeren Resultset.
Denn kein datensatz kann die Bedingung "größer als Text '9.2015'" und gleichzeitig "kleiner als text '1.2016'" erfüllen.

Also, WENN du unbedingt ein künstliches Feld im View anlegen möchtest zu Forschungs- und Weiterbildungszwecken, dann ind der Art
CREATE view whatever as 
SELECT monat, jahr
             , convert(char(8), DateFromParts( jahr, monat, 1), 112)  as DateAsIso --yyyymmdd 
FROM deineTable
Hier wird benutzt:
DateFromParts(2015, 9, 1) --> liefert einen Datumswert 01.09.2015
Convert( char(8), datumswert, 112) macht ein Datum zum String im Format YYYYMMTT


Aber ich finde den Nutzen dieses Zusatzfeldes eher gering.
ich würde direkt auf jahr und monat vergleichen.

Grüße
Biber
[Edit] Upps, BirdyB war schneller. [/Edit]
BirdyB
BirdyB 23.03.2016 um 12:01:28 Uhr
Goto Top
Wo ist eigentlich jodels Beitrag geblieben?
@Biber: Hunger gehabt? face-wink
Biber
Biber 23.03.2016 um 12:08:59 Uhr
Goto Top
[OT]
Moin BirdyB,

Zitat von @BirdyB:

Wo ist eigentlich jodels Beitrag geblieben?
@Biber: Hunger gehabt? face-wink
Ich war es nicht... war genauso verblüfft wie Du.
Wollte nämlich auch mal nachlesen, auf welchen Link er verwiesen hatte.

Hm, vielleicht taucht er ja unter dem Nick houdini32 wieder auf ganz plötzlich...

Grüße
Biber
[/OT]
Bluejet
Bluejet 23.03.2016 um 13:18:06 Uhr
Goto Top
Vielen Dank erstmal für Eure Antworten!

Wie ich das so rauslese, ist mein Lösungswenig nicht so optimal.
Die Tabellen mit den Spalten 'Jahr' und 'Monat' sind so allerdings bereits im Einsatz, also muss ich damit leider irgendwie arbeiten.

Bezüglich DateFromParts werde ich jetzt noch einmal etwas nachlesen, das klingt insgesamt ganz interessant!

Um die Frage aber nochmal ganz vereinfacht zu stellen: gibt es die Möglichkeit, dass ich nur mit diesen Angaben den Zeitraum von 9.2015 bis 3.2016 abfrage?


Als Ansatz:

SELECT Rechnungsnummer, Monat, Jahr
WHERE


Wären es reine Datumsfelder, würde ich mir ja zu helfen wissen... aber dabei, diese zwei numeric-Felder hier zu kombinieren, wenn es um zwei unterschiedliche Jahre geht, zerbreche ich mir den Kopf...
BirdyB
BirdyB 23.03.2016 um 13:30:14 Uhr
Goto Top
Hallo Bluejet,

mit DateFromParts() baust du dir ja ein Datumsfeld. Daher würde ich einfach die entsprechende View bauen und damit die Abfrage gestalten.
Alternativ
Zitat von @Bluejet:
SELECT Rechnungsnummer, Monat, Jahr
WHERE
(Monat > 9 AND Jahr =2015) OR (Monat < 3 AND Jahr = 2016)

wäre jetzt mal eine Idee (habs nicht getestet)

Beste Grüße!


Berthold
Biber
Lösung Biber 23.03.2016 aktualisiert um 13:34:04 Uhr
Goto Top
Moin bluejet,

wo genau ist das Problem.
Wie würdest du denn diese Einschränkung im Umgangs-Deutsch formulieren?
[Raum für deine Notizen]


[/Raum für deine Notizen]

Im SQL, was sich ja nix anderes ist als stilisiertes Umgangsdenglisch läuft es exakt genauso:
SELECT Rechnungsnummer, Monat, Jahr
WHERE  (jahr =2015 AND monat >=9)
  OR (jahr =2016 AND monat <= 3)

Grüße
Biber
BirdyB
BirdyB 23.03.2016 um 13:34:40 Uhr
Goto Top
@Biber hat recht. Vergiss meinen Vorschlag... (Ich leide noch unter den Nachwirkungen des Nachtdienstes...)
Bluejet
Bluejet 23.03.2016 um 14:25:26 Uhr
Goto Top
Hi Biber,

genau das hat mir peinlicherweise gefehlt. Das Inklammernsetzen in Verbindung mit 'OR' führt genau zu dem Ergebnis, das ich brauche...
Vielen Dank. face-smile

Da habe ich echt VIEL zu kompliziert gedacht, das behalte ich mir in jedem Fall.


Danke nochmal an alle für die Unterstützung!