Member 12561559 Ответов: 1

Sql group by с учетом отношения "один ко многим"


У меня есть SQL-оператор, который должен это сделать:
Показывает количество домов, против страны, где свойство имеет 2 совпадающих "типа людей", т. е. - теперь свойство может иметь 20 продуктов в общей сложности, но 2 будут сопоставлены по моим критериям ниже (125 и 111) - ссылочные номера действительны в моей базе данных и ряд записей получают запись - список уровней возвращается в мой SQL-оператор ниже, но он показывает кучу свойств с количеством 1.

Что я хочу, так это вернуть подсчет внутри страны, количество домов в этой стране (вместе с округом и городом), в которых живут, скажем, 1 взрослый мужчина и 1 взрослая женщина, но сосчитайте дом только один раз.

Страна - это страна
Графство-это графство внутри страны
Город - это город в пределах округа, в пределах страны.
Дом есть дом
Люди-это тип людей, которые могут быть "взрослыми мужчинами","взрослыми женщинами","детьми-мужчинами" и "детьми-женщинами".
LivingThere-это стол, который соединяет людей с домом и тех, кто живет в доме. Он имеет 3 поля, первичное для себя, HouseRef и PeopleRef.


SELECT Country.Country,
Country.CountryRef,
COUNT(DISTINCT House.HouseRef) AS [Facility Count]
     FROM Country
        INNER JOIN County ON Country.CountryRef = County.CountryRef 
        INNER JOIN City ON County.CountyRef = City.CountyRef 
        INNER JOIN House ON City.CityRef = House.CityRef
        INNER JOIN LivingThere ON House.HouseRef = LivingThere.HouseRef
        INNER JOIN People ON LivingThere.LivingThereRef = People.LivingThereRef
WHERE     (LivingThere.LivingThereRef IN (125, 111))
GROUP BY Country.Country, Country.CountryRef, House.HouseRef
HAVING      (COUNT(LivingThere.LivingThereRef) = 2)



Я думаю, что я почти там - я получаю список домов, которые соответствуют критериям людей для стран, где количество просто показывает 1 на запись, а не, скажем, 1000 против if. и если я подсчитаю эти дома (например, вставив список в открытый офис), то они кажутся правильными, но я ищу общий суб-итог по каждой стране.
Что я упустил? :/

Что я уже пробовал:

Изменение группы и выбирать разные

1 Ответов

Рейтинг:
1

OriginalGriff

Проблема в том, что GROUP BY не "уточняет" результаты, добавляя к ним поля, а генерирует больше строк с большим количеством полей.
Попробуй выбить страну из колеи.Кантриреф и хаус.Поля HouseRef из вашего предложения GROUP BY и посмотрите, что произойдет.


Member 12561559

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

OriginalGriff

Ну конечно же! Но добавление предложений не делает того, что вы хотите, совсем наоборот.
Начать здесь:

https://www.codeproject.com/Articles/1110163/SQL-GROUP-By-and-the-Column-name-is-invalid-in-the

И подумайте о том, что именно вы пытаетесь извлечь.

Member 12561559

Это отличная и хорошая статья, которую вы там написали :) Я понимаю, как работает Group By (и даже больше теперь благодаря вашей статье), поэтому, полностью удалив HAVING, я закончил подсчет каждого раза, когда люди жили в доме - однако я не хочу подсчитывать, сколько людей находится в доме (в моем запросе выше, 2 человека) Я получаю два результата - если я добавлю ребенка - женщину или ребенка - мужчину-мои подсчеты пойдут еще дальше-я не хочу этого ,я хочу подсчитать количество домов, в которых проживают мужчина и женщина, и сосчитать дом один раз.
Например, если бы у меня был
Дом содержится 1 Мужчина, 1 женщина взрослый
Дом б содержит 1 взрослого мужчину
Дом с содержит 1 взрослую женщину
а дом D содержит 1 взрослого мужчину, 1 взрослую женщину и 2 детей женского пола
и я должен был выполнить SQL Group By Having clause чтобы увидеть сколько домов имеют 1 взрослый мужчина и 1 взрослая женщина там я должен был увидеть список результатов
Дом А и дом Д
Считая 2 дома
Делая это по странам, если бы дом А и дом D были в 2 разных странах, я бы хотел видеть 1 Счет в каждой стране, но если бы они были в одной и той же стране, разных округах и разных городах, я бы хотел видеть счет 2 для этой страны.

OriginalGriff

Итак, вы хотите начать с группировки домов вместе, а затем использовать необходимость фильтровать этот результат до числа, содержащего мужчину и женщину.
Начните там, заставьте это работать, и вы можете начать "двигаться вверх по цепочке" оттуда. Как только вы узнаете, какие дома совпадают, вы можете объединить их с остальными вашими таблицами (и, возможно, сгруппировать их, я не вижу ваших данных), чтобы начать создавать нужные вам данные.

Member 12561559

Я только начал это делать, прежде чем заметил ваш ответ :) Я снова его сломал. В основном пример, который я вам привел, является упрощенной версией того, над чем я на самом деле работаю,если мы поменяем дома на "собственность" и "людей" на "продукт", страну, округ и город на уровень 1, Уровень 2 и Уровень 3, которые у меня теперь есть:
Выберите отдельное свойство.PropertyRef
От уровня 1 внутреннее соединение
Уровень 2 на уровне 1.Level1Ref = Level2.Level1Ref внутреннее соединение
Уровень 3 на уровне 2.Level2Ref = Level3.Level2Ref внутреннее соединение
Недвижимость на уровне 3.Level3Ref = Свойство.Level3Ref внутреннее соединение
Product_Operator на собственность.PropertyRef = Product_Operator.PropertyRef внутреннее соединение
Продукт на Product_Operator.ProductRef = Продукт.ProductRef
Где (Product_Operator.ProductRef IN (125, 111))
Группировка по свойству.PropertyRef
HAVING (COUNT(Product_Operator.ProductRef) = 2)

это показывает мне список объектов недвижимости/домов, в которых есть то, что я ищу, но, клянусь Богом, он не позволит мне сгруппировать его в страну - вот над чем я постараюсь поработать дальше - я сохраню этот бит SQL, чтобы вернуться к нему, когда я сделаю собачий ужин из попыток расширить его - если я найду ответ, то я опубликую его-спасибо мистеру Гриффу - дам ему еще один шанс!