2013-04-16 3 views
0

주식보기 (모든 개별 주식 및 주식 날짜를 나열 함)와 판매보기 (모든 판매 및 판매 날짜를 나열 함) 발생했다).SQL Join Help - 합계 전에 테이블에 필터 합계 및 적용

증권보기 :

+----+------+-----+------------+ 
| ID | Item | Qty | Date | 
+----+------+-----+------------+ 
| 1 | A | 3 | 01/01/2000 | 
| 2 | A | 2 | 02/02/2000 | 
| 3 | D | 9 | 05/06/2000 | 
| 4 | F | 22 | 09/01/2001 | 
| 5 | A | 10 | 01/04/2001 | 
| 6 | C | 12 | 01/01/2002 | 
+----+------+-----+------------+ 

판매 전망 :

+------+-----+------------+ 
| Item | Qty | Date | 
+------+-----+------------+ 
| B | 3 | 01/01/2001 | 
| B | 77 | 01/12/2001 | 
| C | 9 | 02/02/2002 | 
| A | 10 | 03/03/2002 | 
| G | 2 | 05/06/2002 | 
| C | 3 | 09/10/2012 | 
+------+-----+------------+ 

내가 그렇게하기 전에 이러한 tables..but에 가입하려면 :

주식 뷰가 2 일 사이에 필터를 적용 할 필요가 매개 변수 @StockFrom 및 @StockTo

2 개 날짜 사이에 판매 뷰를 필터링해야합니다. rameters @SalesFrom 및 @SalesTo

Sales 뷰는 Item별로 그룹화하고 Qty Summed (날짜 필드를 필터링해야 함에도 불구하고 삭제해야 함)를 필요로하고 Item의 Stock View에 결합해야합니다 들.

본질적으로 주식보기는 그 날짜에 발생한 2 개의 날짜 사이에 발생한 판매를 보여주는 추가 열로 보입니다 (날짜는 필터링 됨).

원하는 출력 : 사전에 어떤 도움을

+----+------+-----+------------+-------+ 
| ID | Item | Qty | Date | Sales | 
+----+------+-----+------------+-------+ 
| 1 | A | 3 | 01/01/2000 | 10 | 
| 2 | A | 2 | 02/02/2000 | 10 | 
| 3 | D | 9 | 05/06/2000 |  0 | 
| 4 | F | 22 | 09/01/2001 |  0 | 
| 5 | A | 10 | 01/04/2001 | 10 | 
| 6 | C | 12 | 01/01/2002 | 12 | 
+----+------+-----+------------+-------+ 

감사합니다!

+0

이'Date'의 종류 무엇입니까 전지? – Nalaka526

+2

여기서 물어보기 전에 뭔가를 시도해야합니다 (또는 뭔가 시도해 본 경우). [so]는 쿼리 작성 서비스가 아닙니다. – Dukeling

+0

당신의 데이터베이스는 어느 것입니까? MS SQL 서버 또는 MySql 또는 Oracle 또는 ...? – TechDo

답변

0
SELECT 
    Stock.*, 
    IFNULL(SUM(Sales.Qty),0) AS Sales 
FROM Stock 
LEFT JOIN Sales ON Stock.Item=Sales.Item 
WHERE Stock.Date BETWEEN @StockFrom AND @StockTo 
AND (
    Sales.Date BETWEEN @SalesFrom AND @SalesTo 
    OR Sales.Date IS NULL 
) 
GROUP BY Stock.ID 

diaclect를 지정하지 않았으므로 이것은 MySQL 용입니다. MS SQL에 대한 SQLfiddle

편집

SELECT 
    Stock.ID AS ID, 
    MIN(Stock.Item) AS Item, 
    MIN(Stock.Qty) AS Qty, 
    MIN(Stock.Date) AS Date, 
    CASE WHEN SUM(Sales.Qty) IS NULL THEN 0 ELSE SUM(Sales.Qty) END AS Sales 
FROM Stock 
LEFT JOIN Sales ON Stock.Item=Sales.Item 
WHERE Stock.Date BETWEEN @StockFrom AND @StockTo 
AND (
    Sales.Date BETWEEN @SalesFrom AND @SalesTo 
    OR Sales.Date IS NULL 
) 
GROUP BY Stock.ID 

작업 (SQLfiddle)

+0

이 Eugen에 감사드립니다. 합류하기 전에 매출을 필터링하고 합산 할 수 없습니까? 두 테이블 모두에 많은 행이 포함되므로 효율성에 대해 걱정합니다. 편집 : 따라서 판매 테이블에는 재고 테이블에 가입하기 전에 정의 된 기간 동안의 총 매출을 보여주는 항목 당 1 행이 있습니다. –

+1

@TomJenkin 우리는 전에 테이블을 필터링합니다 - 실행 계획을 살펴보십시오. –

+0

방금이 쿼리를 구현했으며 실제로 잘 작동하는 것 같습니다! 고맙습니다 :) –

0

MS SQL 서버에 대한 쿼리 아래 시도하십시오 :

SELECT DISTINCT 
    a.ID, 
    a.Item, 
    a.Qty, 
    a.Date, 
    ISNULL(SUM(b.Qty) OVER (PARTITION BY a.Item, a.[Date]), 0) Sales 
FROM 
    StockView a LEFT JOIN SalesView b on a.Item=b.Item