Har stött på patrull när jag håller på med SQL och personnummer-kontroll. Använder mig av vanlig hederlig ASP och MySQL hos Binero.
Jag har 1000st enkätsvar på en enkät med 54st frågor med svarsalternativen Ja (1), Nej (2), Vet ej (3). Till varje enkätsvar så finns ett personnummer som är formaterat enligt ÅÅMMDDXXXX (eller _är i de flesta fall formaterat så_ i alla fall, det fanns ingen validering för hur det skulle anges). Vi utgår från det formatet, resten blir "övrigt".
Att sumera antalet 1, 2, 3 är ju inga problem, men hur lägger jag in kontrollen om personnumret är en man eller kvinna i SQL-frågan?
Så här har jag tänkt mig det:
Set Enkat = Connect.Execute("SELECT " & _
"SUM(case when (Question_1 = 1) then 1 else 0 end) as Q_1_t_ja, " &_
"SUM(case when (Question_1 = 1 AND Personnummer = KVINNA) then 1 else 0 end) as Q_1_ja_kv, " &_
"SUM(case when (Question_1 = 1 AND Personnummer = MAN) then 1 else 0 end) as Q_1_ja_man, " &_
"SUM(case when (Question_1 = 2) then 1 else 0 end) as Q_1_t_nej, " &_
"SUM(case when (Question_1 = 2 AND Personnummer = KVINNA) then 1 else 0 end) as Q_1_nej_kv, " &_
"SUM(case when (Question_1 = 2 AND Personnummer = MAN) then 1 else 0 end) as Q_1_nej_man, " &_
"SUM(case when (Question_1 = 3) then 1 else 0 end) as Q_1_t_vetej, " &_
"SUM(case when (Question_1 = 3 AND Personnummer = KVINNA) then 1 else 0 end) as Q_1_vetej_kv, " &_
"SUM(case when (Question_1 = 3 AND Personnummer = MAN) then 1 else 0 end) as Q_1_vetej_man " &_
"FROM tabell_enkatsvar_2011")
Och då summeras ju det så här:
Totalt antal Ja = Enkat("Q_1_t_ja")
Totalt antal Ja varav kvinnor = Enkat("Q_1_t_ja_kv")
Totalt antal Ja varav Män = Enkat("Q_1_t_ja_man")
Och samma sak för antal NEJ och antal VET EJ
"Personnummer = KVINNA" fungerar ju inte så klart, så hur gör jag en kontroll i SQL efter att ett personnummer enligt ÅÅMMDDXXXX är en man/kvinna?
Och som en extrafråga... Är det här ett bra sätt att göra den här summeringen på?
select
sum(
case when Question_1 = 1 and convert(substring(Personnummer, -2, 1), unsigned integer) mod 2 = 0 /* Man */ then 1 else 0 end
) as Q_1_ja_ma,
sum(
case when Question_1 = 1 and convert(substring(Personnummer, -2, 1), unsigned integer) mod 2 <> 0 /* Kvinna */ then 1 else 0 end
) as Q_1_ja_kv
...
Kanske. I mitt förra inlägg räknade jag sista siffran som kontrollsiffra. Ovanstående exempel kräver att personnummer är i formatet YYMMDDXXXX - annars fallerar den.
Det som händer är att jag plockar ut det näst sista tecknet i personnumret och konverterar till ett heltal, och sedan använder modulus-operatorn för att avgöra om det är ett jämnt tal eller inte.
Med fallerar, menar du att den kommer ge felmeddelande, eller bara inte räkna med resultatet?
Jag vill att ha tre summeringar per svarsalternativ:
Totalt antal JA, oavsett korrekt personnummer eller inte
Varav antal JA är MÄN, med korrekt personnummer
Varav antal JA är KVINNOR, med korrekt personnummer
Alltså Total-summan behöver inte bli samma sak som JA_Män + JA_Kvinnor.