datepart mit case

marega

Benutzer
Beiträge
9
Hallo zusammen,

ich nehme gerade an einem SQL Seminar teil und verzweifele an einer Aufgabe. Kann mir hier jemand mit der Lösung helfen?

Die Spalte dbo.sales.ord_date enthält Datum/Uhrzeit der jeweiligen Bestellungen. Ich möchte diese Daten als Wochentag mit weekday ausgeben, und anstelle der 1, 2, 3, 4, 5, 6, 7, möchte ich Montag, Dienstag, Mittwoch[...] ausgeben lassen.

select datepart (weekday, ord_date) = case
when s.ord_date = '1' then 'Montag'
when s.ord_date = '2' then 'Dienstag'
when s.ord_date = '3' then 'Mittwoch'
from sales s

Das MS SQL Management Studio unterkringelt mir das 'ord_date' (als Tabellenangabe in Zeile 1) und das darauf folgende '='.
Wenn ich eine datepart Abfrage einzeln eingebe, funktioniert diese syntax, wenn ich case ohne datetime eingebe, funktioniert meine syntax - in Kombination aber nicht!

Wieso? Und was müsste ich ausbessern, damit ich meine Ausgabe bekomme?
 
Zuletzt bearbeitet:
Werbung:
Also CASE Schleifen bieten mehrere Syntax-Varianten aber ich sag mal regulär wäre sowas hier:
Code:
select ( case
when datepart(weekday,s.ord_date) = 1 then 'Montag'
when datepart(weekday,s.ord_date) = 2 then 'Dienstag'
when datepart(weekday,s.ord_date) = 3 then 'Mittwoch'
else 'wusa'
end ) as tolle_spalte
from sales s
 
Wenn du nur nach einer möglichst Schlanken CASE-Lösung suchst, beim Gleich-Operator kann man das meine ich auch so lösen:
Code:
select ( case datepart(weekday,s.ord_date)
when 1 then 'Montag'
when 2 then 'Dienstag'
when 3 then 'Mittwoch'
else 'wusa'
end ) as tolle_spalte
from sales s
 
ich hab scheinbar immer noch etwas Verständnisschwierigkeiten wenn es um case geht.
Ich möchte im Prinzip das selbe machen wie im Beispiel vorher, aber eben auch mit count(*) (wobei das count hier eigentlich unabhängig von dem case sein sollte)

select datepart(mm, t.tdatum) Monat,
count (distinct k.knr) Kunden,
count (distinct kto.ktonr) Kundenkonten,
cast (count (distinct t.tannr) as numeric) Transaktionen
from transaktion t
join konto kto
on kto.ktonr = t.ktonr
join kunde k
on k.knr = kto.knr
where t.tdatum between '01.01.2014' and '31.12.2014'
group by datepart(mm, t.tdatum)


aber wenn ich hier ein case einbaue beim select (nach dem Muster des anderen Beispiels), bekomme ich Fehlermeldungen.
Wie müsste ich hier das case einbauen, um anstelle einer '1' bei Monat ein 'Januar' zu bekommen?
 
Da du nicht sagst welche Fehlermeldung (die im Übrigen recht aufschlussreich sind), tippe ich mal das du CASE nur im Select-Teil eingebaut hast, die CASE Anweisung muss aber auch entweder aggregiert werden oder im GROUP BY genannt werden.

Variablen machen keinen Sinn, eventuell aber ein Zwischenschritt um die CASE Schleife nicht zweimal nennen zu müssen.
 
Ich habe eigentlich auch keine Fehlermeldung in dem Sinne, da ich es noch nicht ausgeführt hab.
Ich habe Schwierigkeiten das Case überhaupt einzubauen bzw. weiß nicht genau wie und wo.

Hast du vlt. ein Vorschlag wo und wie ich das case einfügen muss, um eben das gewünschte Resultat (anstelle von Zahlen direkt die Namen der Monate ausgegeben zu bekommen)?

Vielen Dank!
 
Also Selects kann man eigentlich immer erstmal ausführen um herauszufinden, ob sie denn nun gehen oder nicht.

Wenn ich deinen Select nehme und ein CASE einsetzen würde müsste ich das streng genommen im Select-Teil und im GROUP BY auf identische Weise machen:
Code:
SELECT    datepart(mm,t.tdatum) Monat,
        (    CASE    datepart(weekday,t.datum)
            WHEN 1 THEN 'Montag'
            WHEN 2 THEN 'Dienstag'
            WHEN 3 THEN 'Mittwoch'
            ELSE 'wusa'
            END ) AS tolle_spalte,
        count(DISTINCT k.knr) Kunden,
        count(DISTINCT kto.ktonr) Kundenkonten,
        count(DISTINCT t.tannr) Transaktionen
FROM    transaktion t
JOIN    konto kto
ON        kto.ktonr = t.ktonr
JOIN    kunde k
ON        k.knr = kto.knr
WHERE    t.tdatum BETWEEN '2014-01-01 00:00:00.000' AND '2014-31-12 00:00:00.000'
GROUP BY datepart(mm,t.tdatum),
        (    CASE    datepart(weekday,t.datum)
            WHEN 1 THEN 'Montag'
            WHEN 2 THEN 'Dienstag'
            WHEN 3 THEN 'Mittwoch'
            ELSE 'wusa'
            END )
 
Werbung:
Zurück
Oben