2017-01-13 7 views
0
Table structures 

Table Products : 
============================================= 
ID | Store | Type | Cost | NetCost | 
============================================= 
1 |102 | 0 |14.95 | 29.65 
2 |103 | 1 |13.95 | 32.65 
3 |104 | 2 |12.36 | 42.12 
4 |105 | 3 |10.24 | 23.11 
5 |106 | 4 |19.57 | 27.16 
6 |102 | 0 |57.26 | 26.98 
7 |103 | 3 |43.26 | 26.98 
8 |104 | 4 |10.26 | 26.98 
9 |105 | 1 |9.26 | 26.98 
10 |105 | 5 |11.26 | 46.98 


Same table separated into two tables by Type 
Premium products : Type = (0, 1, 2) 
Basic products : Type = (3, 4, 5) 

Table Products : Products with Type (0,1,2) 
============================================= 
ID | Store | Type | Cost | NetCost | 
============================================= 
1 |102 | 0 |14.95 | 29.65 
2 |103 | 1 |13.95 | 32.65 
3 |104 | 2 |12.36 | 42.12 
6 |102 | 0 |57.26 | 26.98 
9 |105 | 1 |9.26 | 26.98 

Table Products : Products with Type (3,4,5) 
============================================= 
ID | Store | Type | Cost | NetCost | 
============================================= 
4 |105 | 3 |10.24 | 23.11 
5 |106 | 4 |19.57 | 27.16 
7 |103 | 3 |43.26 | 26.98 
8 |104 | 4 |10.26 | 26.98 
10 |105 | 5 |11.26 | 46.98 

(자체 가입 테이블) 조인에 여러 개의 하위 쿼리를 변환합니다.내가, 카운트 스토어로 그룹화 유형을 기반으로하는 모든 제품에 대한 비용과 NetCost 합계를

Table of totals: (B = Basic, P= Premium) 
================================================================= 
Store | B Cnt |B Cost | B NetCost | P Cnt | P Cost | P NetCost | 
================================================================= 
102 
103 
104 
105 
106 

나는 아래의 하위 쿼리와 마스터 쿼리를 사용하여 위를 달성 할 수있는, 더 효율적인 가입 (가입 테이블 자체 등으로) 나는 할 수있다 : 결과는 다음과 같아야합니다 위의 표 (합계)를 달성 할 것인가?

SELECT 
    count(*) 
FROM 
    Products prod_prem 
WHERE 
    (prod_prem.Type = 0 OR prod_prem.Type = 1 OR prod_prem.Type = 2) 

SELECT 
    SUM(Cost), 
FROM 
    Products prod_prem 
WHERE 
    (prod_prem.Type = 0 OR prod_prem.Type = 1 OR prod_prem.Type = 2) 

SELECT 
    SUM(NetCost) 
FROM 
    Products prod_prem 
WHERE 
    (prod_prem.Type = 0 OR prod_prem.Type = 1 OR prod_prem.Type = 2) 


SELECT 
    count(*) 
FROM 
    Products prod_basic 
WHERE 
    (prod_prem.Type = 3 OR prod_prem.Type = 4 OR prod_prem.Type = 5) 


SELECT 
    SUM(Cost), 
FROM 
    Products prod_basic 
WHERE 
    (prod_prem.Type = 3 OR prod_prem.Type = 4 OR prod_prem.Type = 5) 


SELECT 
    SUM(NetCost) 
FROM 
    Products prod_basic 
WHERE 
    (prod_prem.Type = 3 OR prod_prem.Type = 4 OR prod_prem.Type = 5) 

답변

2

당신은 Conditional Aggregation

SELECT Store, 
     [B Cnt] = Count(CASE WHEN Type IN (3, 4, 5) THEN 1 END), 
     [B Cost] = Sum(CASE WHEN Type IN (3, 4, 5) THEN Cost ELSE 0 END), 
     [B NetCost] = Sum(CASE WHEN Type IN (3, 4, 5) THEN NetCost ELSE 0 END), 
     [P Cnt] = Count(CASE WHEN Type IN (0, 1, 2) THEN 1 END), 
     [P Cost] = Sum(CASE WHEN Type IN (0, 1, 2) THEN Cost ELSE 0 END), 
     [P NetCost] = Sum(CASE WHEN Type IN (0, 1, 2) THEN NetCost ELSE 0 END) 
FROM Products 
GROUP BY Store 
+0

이것은 훨씬 깨끗해 보이고 이해할 수있는 것처럼 보입니다. 나중에 나중에 시도해보고 효과가 있으면 답을 수락합니다. 그레시아. – Fabii

0

당신은 IsPremium 비트 열이있는 ProductType 테이블을해야 사용하여 단일 쿼리에서이 작업을 수행 할 수 있습니다 : 나는 마스터 쿼리에 배치 할

하위 쿼리. 그렇게하면 6, 7, 8을 입력 할 때 코드의 끔찍한 오류가 발생하기 쉬운 유지 관리 작업을 수행 할 필요가 없습니다. 형식 테이블에 새로운 행을 삽입하면됩니다.

+0

나는 테이블을 유지하지 않기 때문에 나는 그들과 함께 일해야한다. – Fabii

+0

Gotcha. 이것이 저장 프로 시저에있는 경우 프로 시저 내에서 임시 테이블로 만들 수 있으므로 "프리미엄"은 proc의 한 위치에서만 정의됩니다. 그 가치보다 더 많은 어려움이있을 수 있습니다, 그냥 제안 –

+0

나는 이것을 염두에 두겠습니다. – Fabii