1 adres weergeven, uit een ledenbestand, met meerdere leden (Distinct)

Status
Niet open voor verdere reacties.

FerryW

Gebruiker
Lid geworden
12 aug 2013
Berichten
41
Leden bestand met 650 leden.
Alle leden hebben eigen Lidnummer en uiteraard hun Naam, Straat, Huisnummer, Postode, Plaats, Sex, etc etc

Wens:
Nu wil ik graag alle leden per post een bericht sturen, dus een etiket samenstellen. Maar niet per lid, maar per huisadres (dit scheelt niet alleen Portokosten, maar het is ook onzin om meerdere brieven met eenzelfde inhoud aan 1 adres te sturen).
Tevens wil ik graag bij meer dan 1 op eenzelfde adres aanvangen met Fam (van familie, naam van de man) en bij leden die uit 1 huisgezin bestaan aanvangen met 'De Heer ' en/of "Mevr." (dit zou kunnen obv veld Sex; M of V).

Hoe?
Een select distinct gaat over alle kolommen (aangezien achternaam van de man, evt een partner met meisjesnaam en een lidnummer altijd anders zijn), lukt het mij niet om en slimme SQL query te bedenken, die dit voor elkaar krijgt.

Wie kan mij een handige tip geven om dit (volgens mij standaard) probleem te tackelen.

Voorbeeld:
Lidnummer, Achternaam, Voornaam, geb.datum, sex, Straat, HsNr, Postcode, Plaats, etc, etc,
1, janssen, piet, 1963-01-01, M, kerkstraat, 14, 1234AB, Tietjerkstradeel,...,....
2, janssen-pietersen, Mirna, 1964-01-02,V, kerkstraat, 14, 1234AB, Tietjerkstradeel,...,....
3, janssen, adam, 1999-01-01, M, kerkstraat, 14, 1234AB, Tietjerkstradeel,...,....
4, janssen, eva, 1998-01-01, V, kerkstraat, 14, 1234AB, Tietjerkstradeel,...,....

Moet leiden tot een etiket:
Fam. janssen
Kerkstraat 14
1234AB Tietjerkstradeel

Indien 2,3 en 4 niet bestaan tot etiket:
De heer Janssen
Kerkstraat 14
1234AB Tietjerkstradeel


Ik hoop het voldoende duidelijk te hebben beschreven.
onder MySQL 2005


Vast dank voor de moeite
Met vriendelijke groeten
Ferry
Lelystad
 
Laatst bewerkt:
Wat heb je zelf al geprobeerd? ;)
 
Ik probeer uiteraard van alles. Maar omdat ik werk met de Distinct clause, heb ik maar 1 kolom waarmee die ik uniek kan maken. Hierdoor mis ik de feitenlijke gegevens.

Voorbeeld:
[sql]Select top 10 lidnummer,
if geslacht='M' then 'De Heer' else 'Mevrouw' endif as aanhef,
achternaam, straat, postcode, huisnummer, plaats, postcode+huisnummer as PH
from lid
where PH in (Select distinct(postcode+huisnummer) from lid)[/sql]

------------
Als ik beide regels separaat op mijn tabel LID loslaat, komen de goede gegevens.
Maar zodra ik het probeer te combineren, krijg ik:
-Of helemaal niets, als ik (postcode+huisnummer) uit mijn eerste select weglaat
-of weer alles (dus ook de dubbele straatnamen)?

Graag jullie reacties,
mvg
Ferry
 
Laatst bewerkt door een moderator:
Met een GROUP BY in combinatie met COUNT lijk ik er aardig uit te komen :)
[sql]
SELECT
CASE
WHEN
COUNT(lidnummer) > 1 THEN 'Fam.'
ELSE
CASE
WHEN sex = 'M' THEN 'De heer'
ELSE 'Mevrouw'
END
END AS Aanhef,
achternaam,
straat,
hsnr,
postcode,
plaats
FROM
lid
GROUP BY
postcode+hsnr;
[/sql]
http://sqlfiddle.com/#!2/d7e8a1/1
 
Beste Tha Devil,

Sowieso dank voor je reactie,

Ik ben niet zo bekend met het gebruik van de Group By, en dat komt omdat als ik deze gebruik, er altijd een extra kolom bij gevraagd wordt.
Zo ook in jouw prachtige oplossing. Ik krijg nu nl het volgende als fout terug:
"Function or column reference to 'sex' must also appear in a GROUP BY"

Gelijk deze toegevoegd, dus staat er nu
........
GROUP BY
postcode+hsnr, sex;

Maar dat biedt helaas geen soelaas, want komt de volgende opmerking dat ook 'achternaam' moet worden toegevoegd in de Group By
Pas als ik alle velden heb toegevoegd krijg ik resultaat, Joepie! Maar waarom ik al die velden moet toevoegen?

Je hebt mij hier enorm mee geholpen, als je nog kunt/wilt reageren op deze Group By, dan heel graag.

Met vr groet.
Ferry
 
Ik snap nu beter hoe de Group By zich manifesteert. Dus heb het als volgt opgelost:
[sql]SELECT
postcode+huisnummer,
Achternaam,
CASE
WHEN
count(*) > 1 THEN 'Fam. '
ELSE
CASE
WHEN max(geslacht) = 'M' THEN 'De heer '
ELSE 'Mevrouw '
END
END + max(voorletters)+' '+max(tussenvoegsel)+' '+max(achternaam)+'
'+max(straat)+ ' ' +max(huisnummer)+ ' ' +max(huistoev)+ '
'+max(postcode)+' '+max(plaats) as correspondentie

FROM
lid
Where (Uitschrijfdatum is null or uitschrijfdatum>Now(*))
and bedrijf='N'
and archived='N'
and lid.lidnummer <> 1563 %% dit lid excluden
and lid.contributiecode <> 'SYS1'
GROUP BY
postcode+huisnummer, achternaam

Order By Achternaam asc[/SQL]

Het resultaat is 98 %, ik krijg nl toch nog een paar ongewenste, maar daar kom ik wel uit. Dank voor jullie reacties.

ps de link die Tha Devil mee zond is overigens zeer aanbevelingswaardig, http://sqlfiddle.com/#!2/d7e8a1/1
 
Laatst bewerkt door een moderator:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan