반응형
여러 테이블을 카운트()하기 위한 SQL 쿼리
저는 다른 테이블과 하나부터 여러 개의 연관성이 있는 테이블을 가지고 있습니다.메인 테이블이 사람이고, 다른 테이블은 애완동물, 자동차, 어린이를 나타낸다고 가정해 보겠습니다.그들이 키우는 사람, 애완동물의 수, 자동차, 아이들에 대한 세부사항을 돌려주는 질문을 원합니다.
사용자.이름 수(자동차) 수(어린이) 수(애완동물) 존 스미스 3 2 4밥브라운 130
이것을 하는 가장 좋은 방법은 무엇입니까?
하위 쿼리 요인 설계(9i+):
WITH count_cars AS (
SELECT t.person_id
COUNT(*) num_cars
FROM CARS c
GROUP BY t.person_id),
count_children AS (
SELECT t.person_id
COUNT(*) num_children
FROM CHILDREN c
GROUP BY t.person_id),
count_pets AS (
SELECT p.person_id
COUNT(*) num_pets
FROM PETS p
GROUP BY p.person_id)
SELECT t.name,
NVL(cars.num_cars, 0) 'Count(cars)',
NVL(children.num_children, 0) 'Count(children)',
NVL(pets.num_pets, 0) 'Count(pets)'
FROM PERSONS t
LEFT JOIN count_cars cars ON cars.person_id = t.person_id
LEFT JOIN count_children children ON children.person_id = t.person_id
LEFT JOIN count_pets pets ON pets.person_id = t.person_id
인라인 뷰 사용:
SELECT t.name,
NVL(cars.num_cars, 0) 'Count(cars)',
NVL(children.num_children, 0) 'Count(children)',
NVL(pets.num_pets, 0) 'Count(pets)'
FROM PERSONS t
LEFT JOIN (SELECT t.person_id
COUNT(*) num_cars
FROM CARS c
GROUP BY t.person_id) cars ON cars.person_id = t.person_id
LEFT JOIN (SELECT t.person_id
COUNT(*) num_children
FROM CHILDREN c
GROUP BY t.person_id) children ON children.person_id = t.person_id
LEFT JOIN (SELECT p.person_id
COUNT(*) num_pets
FROM PETS p
GROUP BY p.person_id) pets ON pets.person_id = t.person_id
당신은 사용할 수 있습니다.COUNT(distinct x.id)
synthax:
SELECT person.name,
COUNT(DISTINCT car.id) cars,
COUNT(DISTINCT child.id) children,
COUNT(DISTINCT pet.id) pets
FROM person
LEFT JOIN car ON (person.id = car.person_id)
LEFT JOIN child ON (person.id = child.person_id)
LEFT JOIN pet ON (person.id = pet.person_id)
GROUP BY person.name
저는 아마 이렇게 할 겁니다.
SELECT Name, PersonCars.num, PersonChildren.num, PersonPets.num
FROM Person p
LEFT JOIN (
SELECT PersonID, COUNT(*) as num
FROM Person INNER JOIN Cars ON Cars.PersonID = Person.PersonID
GROUP BY Person.PersonID
) PersonCars ON PersonCars.PersonID = p.PersonID
LEFT JOIN (
SELECT PersonID, COUNT(*) as num
FROM Person INNER JOIN Children ON Children.PersonID = Person.PersonID
GROUP BY Person.PersonID
) PersonChildren ON PersonChildren.PersonID = p.PersonID
LEFT JOIN (
SELECT PersonID, COUNT(*) as num
FROM Person INNER JOIN Pets ON Pets.PersonID = Person.PersonID
GROUP BY Person.PersonID
) PersonPets ON PersonPets.PersonID = p.PersonID
RDBMS의 사용자 취향에 따라 다음과 같은 중첩 선택을 지원하는지 여부에 따라 달라집니다.
SELECT p.name AS name
, (SELECT COUNT(*) FROM pets e WHERE e.owner_id = p.id) AS pet_count
, (SELECT COUNT(*) FROM cars c WHERE c.owner_id = p.id) AS world_pollution_increment_device_count
, (SELECT COUNT(*) FROM child h WHERE h.parent_id = p.id) AS world_population_increment
FROM person p
ORDER BY p.name
IIRC, 이것은 적어도 Postgre와 함께 작동합니다.SQL 및 MSSQL.테스트되지 않았으므로 주행 거리가 다를 수 있습니다.
하위 선택 항목을 사용하는 것은 그다지 좋은 방법은 아니지만, 여기에 있을 수도 있습니다.
p.name 을 선택하고 (c.idperson = p.idperson인 cars c에서 count(0) 선택),(ch.idperson = p.idperson인 children ch에서 카운트(0) 선택),(pets pt.idperson = p.idperson에서 카운트(0) 선택)p 인물로부터
세 개의 외부 결합을 사용하여 이 작업을 수행할 수 있습니다.
SELECT
Person.Name,
sum(case when cars.id is not null then 1 else 0 end) car_count,
sum(case when children.id is not null then 1 else 0 end) child_count,
sum(case when pets.id is not null then 1 else 0 end) pet_count
FROM
Person
LEFT OUTER JOIN
cars on
Person.id = cars.person_id
LEFT OUTER JOIN
children on
Person.id = children.person_id
LEFT OUTER JOIN
pets on
Person.id = pets.person_id
GROUP BY
Person.Name
Oracle은 이제 다음과 같은 기능을 지원합니다.case when
구문, 그렇지 않다면 디코드를 사용할 수 있습니다.
쿼리에 여러 개의 카운트 문을 포함해야 합니다.내 머리속에서,
SELECT p.Name, COUNT(DISTINCT t.Cars), COUNT(DISTINCT o.Children), Count(DISTINCT p.Pets)
FROM Person p
INNER JOIN Transport t ON p.ID = t.PersonID
LEFT JOIN Offspring o ON p.ID = o.PersonID
LEFT JOIN Pets p ON p.ID = o.OwnerID
GROUP BY p.Name
ORDER BY p.Name
언급URL : https://stackoverflow.com/questions/1379723/sql-query-to-count-multiple-tables
반응형
'programing' 카테고리의 다른 글
NPM 스크립트 'start'가 Angular CLI가 요청을 수신하고 있음을 표시하지 않고 종료되었습니다. (0) | 2023.10.19 |
---|---|
Xcode에서 파일 이름 또는 리팩터 변경 (0) | 2023.10.19 |
MariaDB 구문 오류 (0) | 2023.10.19 |
다른 사용자가 소유한 데이터베이스 링크 생성을 위한 Oracle 구문 (0) | 2023.10.19 |
Laravel의 데이터베이스 계층을 독립적으로 사용할 수 있습니까? (0) | 2023.10.19 |