---
title: "MySQL/ASP: Kontrollera om personnummer = MAN/KVINNA"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/188423-mysql-asp-kontrollera-om-personnummer-man-kvinna"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "oskars"
published: "2011-11-17T10:14:10.000Z"
updated: "2011-11-18T21:31:25.000Z"
replies: 9
views: 2240
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/188423-mysql-asp-kontrollera-om-personnummer-man-kvinna"
---

# MySQL/ASP: Kontrollera om personnummer = MAN/KVINNA

## #1 — oskars, 2011-11-17T10:14Z

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

Permalänk: https://www.webforum.nu/p/188423

## #2 — metalboy, 2011-11-17T11:30Z

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.

Permalänk: https://www.webforum.nu/p/2288504

## #3 — SPiN, 2011-11-17T11:35Z

Hjärnsläpp! Återkommer...

Permalänk: https://www.webforum.nu/p/2288505

## #4 — oskars, 2011-11-17T11:39Z

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 =(

Permalänk: https://www.webforum.nu/p/2288506

## #5 — SPiN, 2011-11-17T12:45Z

```
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.

Permalänk: https://www.webforum.nu/p/2288510

## #6 — oskars, 2011-11-17T13:20Z

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.

Permalänk: https://www.webforum.nu/p/2288512

## #7 — SPiN, 2011-11-17T13:29Z

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)*.

Permalänk: https://www.webforum.nu/p/2288516

## #8 — oskars, 2011-11-17T16:03Z

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?

Permalänk: https://www.webforum.nu/p/2288531

## #9 — SPiN, 2011-11-17T16:51Z

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... ;)

Permalänk: https://www.webforum.nu/p/2288534

## #10 — aasah, 2011-11-18T21:31Z

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.

Permalänk: https://www.webforum.nu/p/2288562

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/188423-mysql-asp-kontrollera-om-personnummer-man-kvinna
