두 개의 SELECT 문 결과에 참여


174

SELECT하나의 명령문 으로 2 개의 SQL 문 결과를 결합 할 수 있습니까? 나는 마감 시간에 각 레코드는 별도의 작업은 작업의 데이터베이스가 (그리고 PALT단지이며, INT시작부터 마감 시간에 일을. Age도이다 INT일수.)

테이블에 각 사람이있는 테이블, 가지고있는 LATE작업 수 및 가지고있는 작업 수 (있는 경우) 를 갖고 싶습니다 .

이 데이터를 별도의 테이블에 쉽게 가져올 수 있습니다.

SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks

다음과 같은 데이터를 반환합니다.

ks        # Tasks
person1   7
person2   3

그리고 나는 가지고있다 :

SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks

다음을 반환합니다.

ks        # Late
person1   1
person2   1

그리고 나는이 두 가지의 결과에 가입 할 select(바이 문 KS)

임시 테이블을 사용하지 않으려 고하지만 이것이 유일한 실용적인 방법이라면 임시 테이블을이 방식으로 사용하는 방법에 대해 더 알고 싶습니다.

또한 count()조건부를 만족시키는 일종의 행을 시도 했지만 그 방법을 알 수 없었습니다. 가능하다면 작동합니다.

부록이 : 미안 해요, 난 내 결과 열을 위해 갖고 싶어 KS, Tasks하고,Late

KS        # Tasks   # Late
person1   7         1
person2   3         1
person3   2         0  (or null)

또한 나는 늦은 과제가 없어도 사람이 나타나기를 원합니다.

SUM(CASE WHEN Age > Palt THEN 1 ELSE 0 END) Late
이 답변에 감사드립니다!

두 개의 select 문도 작동하며 a LEFT JOIN를 사용 하여 결합해도 작동 하며이 방식으로 여러 selects 를 결합하는 방법을 이해합니다.


예상 결과에 대한 예를 제공하지 않았습니다. 따라서 일부 답변은 결과를 연결합니다. 일부는 참여하고 있습니다. 어느 쪽을 원하십니까?
Phil

죄송합니다, KS, Tasks 및 Late KS에 대한 열이 결과에 표시되기를 원합니다. # Tasks # Late person1 7 1 person2 3 1 person3 2 0 (또는 null) 또한 늦은 작업이 없어도 사람이 나타나기를 원합니다. . 현재 LEFT JOIN과 함께 두 개의 select 문 방법을 사용 하여이 작업을 수행합니다 (제안 된 INNER JOIN과 달리 작동하지만 두 번째 SELECT에는 없기 때문에 늦은 작업이없는 사람은 표시하지 않습니다) 컬럼 인 SUM (CASE WHEN 연령> Palt THEN 1 ELSE 0 END) 후기
sylverfyre

답변:


264
SELECT t1.ks, t1.[# Tasks], COALESCE(t2.[# Late], 0) AS [# Late]
FROM 
    (SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks) t1
LEFT JOIN
    (SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks) t2
ON (t1.ks = t2.ks);

1
레코드가 늦은 작업이 0 인 경우에도 레코드가 표시되도록 LEFT JOIN을 원한다고 지정하지 않았지만 잘 작동합니다.
sylverfyre 2012 년

이 질문에 대한 답변이 가장 도움이 되었기 때문에이 대답을 받아 들였습니다. JOINING SELECT 문에 대한 훌륭한 참조 형식으로되어 있습니다. :)
sylverfyre

훌륭한 답변이지만 누군가 가이 유형의 '솔루션'을 고가로 간주하는지 또는 사용 목적에 따라 다르다고 말할 수 있습니까?
petrosmm

71

다음과 같이 해보십시오 :

SELECT 
* 
FROM
(SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks) t1 
INNER JOIN
(SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks) t2
ON t1.ks = t2.ks

4
나는 받아 들일만한 대답을 얻지 못했지만 이것은 내 필요에 잘 맞았습니다. 감사.
benvenker

매력처럼 일했다. 내가 염려하는 한 이것이 받아 들여지는 대답이어야합니다. 감사.
nocdib

나를 위해 일했다! 감사! 또한 여러 쿼리 (다중 조인)를 사용해 보았고 또한 훌륭합니다. 누군가 궁금해하는 경우 예제에서 마지막 "ON"다음에 추가 JOIN을 추가하고 다음 순서를 계속 사용할 수 있습니다. ON .... X JOIN (QUERY N -1) ON Y = ZX JOIN (QUERY N) ON Y = Z
cesarmart

43

사용 UNION:

SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks
UNION
SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks

또는 UNION ALL중복을 원할 경우 :

SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks
UNION ALL
SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks

3
Union 또는 Union All에는 결과적으로 2 개의 열만 있습니다. 그가 3 개를 원할 때
SurajS

14

Age와 Palt가 같은 테이블에있는 열이면 모든 작업을 계산하고 (*) 다음과 같이 늦은 작업 만 합할 수 있습니다.

select ks,
       count(*) tasks,
       sum(case when Age > Palt then 1 end) late
  from Table
 group by ks

1
이것은 내가 정확히 원하는 것이지만 어떻게 찾는 지 몰랐습니다. 나는 SUM (CASE)을 사용하려고 생각하지 않았습니다. 감사합니다.
sylverfyre 2012 년

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.