webForumDet fria alternativet

MySQL/ASP: Kontrollera om personnummer = MAN/KVINNA

Databaser & SQLur Databashanterare & SQL

9 svar · 2 224 visningar · startad av oskars

Medlem sedan nov. 20051 317 inlägg
Frågan#1

Hej på er! :bire

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å?

Tacksam för hjälp!

/ O

Medlem sedan jan. 2005953 inlägg
#2

Du kollar om näst sista tecknet i personnumret är jämt eller udda.
Om det är jämt, då är det en kvinna.
Om det är udda, då är det en man.

Medlem sedan mars 20007 896 inlägg
#3

Hjärnsläpp! Återkommer...

Medlem sedan nov. 20051 317 inlägg
#4

Jag glömde säga att jag vet att det är 9:e siffran som ska kontrolleras. Men vet inte hur jag gör detta snyggt i MySQL =(

Medlem sedan mars 20007 896 inlägg
#5
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.

Medlem sedan nov. 20051 317 inlägg
#6

Tack så mycket! Ska testa det!

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.

Medlem sedan mars 20007 896 inlägg
#7

Jag vet faktiskt inte om det genererar en varning eller om den helt enkelt skickar ut "0" från case-satsen.

Fungerar det inte med convert() så kan du istället testa med cast(Personnummer as unsigned).

Medlem sedan nov. 20051 317 inlägg
#8

Testat nu... Verkar fungera ganska bra... den ger inga felmeddelanden... men jag vet ju inte hur den räknar heller...

Hur kontrollerar jag detta bäst?

Medlem sedan mars 20007 896 inlägg
#9

Gött :)

Du testar bäst mot en tabell med samma struktur men med mindre data, där du vet hur många det är av varje... ;)

Medlem sedan mars 20034 471 inlägg
#10

Ett alternativ är ju att:

  1. Kolla att personnummer-fältet är 10 tecken långt
  2. att de två första tecknen har ett vettigt värde,
  3. MM är i intervallet 01-12,
  4. samt att YYMMXX faktiskt är ett gångbart datum.
    Då kan du nog vara rimligt säker på att formatet är rätt.

Annars kan du ju även kolla att kontrollsiffran i numret är rätt.

Slutligen... om du kan ha utlandsföddas personnummer bland svaren så får de specialbehandlas vid kollen.

136 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)