Avatar billede noodrem Nybegynder
02. marts 2009 - 19:58 Der er 9 kommentarer og
1 løsning

problem med case

Jeg vil gerne have SQL til at smide 0 foran de måneder der ikke har to cife (1-9). Til dette har jeg forsøgt mig med følgende:

SELECT    DateKey, FullDateAlternateKey, DayNumberOfWeek, EnglishDayNameOfWeek, SpanishDayNameOfWeek, FrenchDayNameOfWeek,
                      DayNumberOfMonth, DayNumberOfYear, WeekNumberOfYear, EnglishMonthName, SpanishMonthName, FrenchMonthName, MonthNumberOfYear,
   
   
    IF MonthNumberOfYear BETWEEN 1 and 9
    THEN '0' + CAST(MonthNumberOfYear AS char(1)) AS CorrectMonthNumber
    ELSE
    CAST(MonthNumberOfYear AS char(2) AS CorrectMonthNumber
    END   
                      , CalendarQuarter, 'Q' + CAST(CalendarQuarter AS char(1)) AS QCalenderQuarter, CalendarYear, CalendarSemester, FiscalQuarter, FiscalYear,
                      FiscalSemester
FROM        dbo.DimDate

Hvor det så er det mellem IF og END der er ikke virker. Hvad gør jeg forkert?
Avatar billede arne_v Ekspert
02. marts 2009 - 20:33 #1
Avatar billede arne_v Ekspert
02. marts 2009 - 20:34 #2
Hvis du er på SQLServer 2005 eller 2008 vil jeg mene at en CLR UDF vil være meget pænere !
Avatar billede noodrem Nybegynder
02. marts 2009 - 20:52 #3
Hmm burde:

CASE WHEN MonthNumberOfYear BETWEEN 1 AND 9 THEN '0' + CAST(MonthNumberOfYear AS Tinyint) ELSE CAST(MonthNumberOfYear AS Tinyint)
END AS CorrectMonth

Så ikke virke? Her melder den ikke fejl, men den undlader dog at smide '0' foran månederne fra 1-9.

Er CLR UDF det samme som en calculation?
Avatar billede Syska Mester
02. marts 2009 - 23:03 #4
UDF = User Defined Function
Avatar billede arne_v Ekspert
02. marts 2009 - 23:51 #5
Den CASE ser rigtig ud *men* jeg er noget i tvivl om data type for MonthNumberOfYear - jeg ville have troet at den var TINYINT og at du vill caste den til VARCHAR, men du caster faktisk til TINYINT.
Avatar billede arne_v Ekspert
02. marts 2009 - 23:52 #6
Jeps.

UDF = User Defines Function

CLR = Common Language Runtime (d.v.s. en UDF som er skrevet i C# eller VB.NET fremfor T-SQL)
Avatar billede noodrem Nybegynder
03. marts 2009 - 13:23 #7
Tak for svarene. MonthNumberOfYear er som standard TINYINT. Jeg har prøvet at caste den til char og varchar, men kan stadig ikke få den til at smide '0' foran de encifrede måneder.

Har det noget at gøre med at SQL ikke kan regne med TINYINT, og jeg derfor skal konvertere til NUMBER før den kan læse BETWEEN?
Avatar billede arne_v Ekspert
04. marts 2009 - 04:04 #8
1> CREATE TABLE casetest(v TINYINT NOT NULL PRIMARY KEY)
2> GO
1>
2> INSERT INTO casetest VALUES(1)
3> GO
(1 row affected)
1> INSERT INTO casetest VALUES(2)
2> GO
(1 row affected)
1> INSERT INTO casetest VALUES(10)
2> GO
(1 row affected)
1> INSERT INTO casetest VALUES(11)
2> GO
(1 row affected)
1>
2> SELECT CASE WHEN v BETWEEN 1 AND 9 THEN '0' + CAST(v AS VARCHAR(2)) ELSE CAST(v AS VARCHAR(2)) END AS v2 FROM casetest
3> GO
v2
----
01
02
10
11

(4 rows affected)
1>
2> DROP TABLE casetest
3> GO
Avatar billede noodrem Nybegynder
05. marts 2009 - 20:36 #9
Har fået det til at virke med:

RIGHT('0' + CAST(MonthNumberOfYear AS Varchar), 2) AS MonthNumber.

Har desværre ikke fået casen til at virke, men tak for hjælpen alligvel. Du smider bare et svar arne_v ;)
Avatar billede arne_v Ekspert
05. marts 2009 - 20:51 #10
OK
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester