두 개의 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.