Подсчет записей, где отношения друг с другом не определены - PullRequest
2 голосов
/ 16 ноября 2011

Я хочу посчитать список записей в моей базе данных, которые все имеют определенные отношения с одним человеком, но мне нужно посчитать их отношения друг к другу - другими словами, они перечислены как сыновья и дочери, братья и сестры главного человека в доме - мне нужно посчитать количество братьев и сестер.

Мой подход состоял в том, чтобы попытаться сосчитать все домохозяйства с более чем одним сыном или дочерью или любое домохозяйство с сыном и дочерью или любое домохозяйство с братом и сестрой, более одного брата или более одной сестры. Однако, когда я пытаюсь поместить это в SQL, я ничего не получаю.

SELECT FirstName, Surname 
FROM individuals
WHERE (RelationshipToHead = 'Son' AND RelationshipToHead = 'Daughter') 
   OR (RelationshipToHead = 'Son' AND RelationshipToHead = 'Son') 
   OR (RelationshipToHead = 'Daughter' AND RelationshipToHead = 'Daughter') 
   OR (RelationshipToHead = 'Brother' AND RelationshipToHead = 'Sister') 
   OR (RelationshipToHead = 'Sister' AND RelationshipToHead = 'Sister') 
   OR (RelationshipToHead = 'Brother' AND RelationshipToHead = 'Brother')

Это просто возвращает все записи, содержащие сына, дочь, брата или сестру, а не те, в каждой из которых есть по одной записи.

Не могли бы вы предложить лучший запрос?

1 Ответ

1 голос
/ 16 ноября 2011

Предложение where сравнивает только значения в каждой строке, поэтому ваш запрос работает не так, как вы хотите. Я предлагаю:

SELECT count(distinct AddressID) HouseholdsWithSiblings, 
       sum(NumberOfSiblings) TotalSiblings
FROM   (SELECT AddressID, count(*) NumberOfSiblings 
        FROM individuals
        WHERE RelationshipToHead in ('Son','Daughter')
        GROUP BY AddressID
        HAVING count(*) > 1
        UNION ALL
        SELECT AddressID, count(*)+1 NumberOfSiblings 
        FROM individuals
        WHERE RelationshipToHead in ('Brother','Sister')
        GROUP BY AddressID) v;
...