2012-11-09 6 views
2

내가 SQL Server의 두 테이블 2008 R2가에서 공통 필드를 기준으로 수와 그룹과 SQL을 작성하는 두 테이블에 걸쳐.어떻게 두 개의 테이블

select 
    'Circle', (select count(1) from Store where Shape = 'Circle'), 
    (select count(1) from Record where PickedShape = 'Circle'), 
    (select count(1) from Record where Finished = 'Y' and PickedShape = 'Circle') 
UNION 
select 
    'Square', (select count(1) from Store where Shape = 'Square'), 
    (select count(1) from Record where PickedShape = 'Square'), 
    (select count(1) from Record where Finished = 'Y' and PickedShape = 'Square') 
UNION... 

과 같이 어리석은 방식으로 쓸 수는 있지만 어리석은 것이며 효율적이지 않습니다.

더 영리한 방법은 그룹별로 사용하는 것입니다. 어떤 사람들은 숟가락 먹이 다른 사람을 좋아하지 않을 수 있기 때문에, 그래서 여기에 내가

SELECT 
    Shape, COUNT(Shape) AS Available, Picked, Finished 
FROM 
    Store 
FULL JOIN 
    (SELECT PickedShape, COUNT(1) As Picked, SUM(CASE WHEN Finished='Y' THEN 1 ELSE 0 END) AS Finished 
    FROM Record 
    GROUP BY PickedShape) t2 ON Store.Shape = t2.PickedShape 
GROUP BY 
    Shape, Picked, Finished 

을 시도 무엇이며, 출력은 문제가 어디에 당신이 볼 수

Shape Available Picked Finished 
NULL  0  2  2 
Circle  3  2  1 
Square  2  2  0 
Triangle 1  NULL NULL 

입니다.

먼저 NULL 대신 Shape 아래에 'Oval'이 있어야합니다. FULL JOIN을 사용하면 두 표 모두에서 모든 변형을 볼 수 있지만 표시하지는 않습니다.

두 번째로 누락 된 항목에 대해 NULL 대신 0을 표시하도록 선택 및 완료합니다.

셋째, 가능한 경우 SQL을보다 효율적으로 만들고 싶습니다.

어떻게 이러한 문제를 해결합니까?

감사합니다.

+0

아마도 유니온을 사용해야 할 것입니다. 스키마와 값은 .. – nawfal

답변

1

조금 수정했습니다 첫 번째 쿼리에서 Shape별로 그룹화했지만 'Oval'은 첫 번째 쿼리에 없습니다. 따라서 파생 된 쿼리에서 도형을받습니다. 트리가 파생 된 쿼리에 없으므로 수량이 0입니다.

SELECT 
    COALESCE(Shape, t2.PickedShape) AS Shape, COUNT(Shape) AS Available, 
    ISNULL(Picked, 0) AS Picked, ISNULL(Finished, 0) AS Finished 
FROM 
Store 
FULL JOIN 
    (SELECT PickedShape, COUNT(1) As Picked, SUM(CASE WHEN Finished='Y' THEN 1 ELSE 0 END) AS Finished 
    FROM Record 
    GROUP BY PickedShape) t2 ON Store.Shape = t2.PickedShape 
GROUP BY 
    Shape, t2.PickedShape, Picked, Finished 
+0

안녕하세요! 고맙습니다! 이제는 SQL을 최적화 할 여지가 더 많습니다. – user1589188

+0

@ user1589188 행운;) –