programing

여러 테이블을 카운트()하기 위한 SQL 쿼리

starjava 2023. 10. 19. 21:49
반응형

여러 테이블을 카운트()하기 위한 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

반응형