2011-01-14 9 views
0

나는 테이블 A로 & 테이블 B를 조인하는 쿼리를 작성하기위한 몇 가지 제안을 찾고 있는데, 테이블 C로 결과를 얻으려고합니다. 두 테이블을 결합 할 수 있어야하고 크로스 탭 쿼리를 작성하십시오. 아래에 표시된 데이터는 두 테이블의 날짜가 매월 바뀌기 때문에 예제 일뿐입니다. 참고 : 두 테이블의 날짜가 겹치지 않습니다. 예를 들어, 아래 표 B는 6 월이나 7 월처럼 미래 날짜를 가질 수 없습니다. 반대로조인/조인 두 테이블에 대한 SQL 쿼리

Table A 
Product Location HistoryDate HistorySales ... more columns 
A   X   June  100 
A   X   July  200 

Table B 
Product Location FutureDate FutureSales ... more columns 
A   X   August 150 
A   X   Sept  50 

Table C 
Product Location June July August September ... other columns from A & B 
A   X  100 200 150 50 

어떤 도움을 주셔서 감사합니다.

+0

당신은 동적 SQL이 필요하거나 모든 12 개월 하드 코딩 및 널 (null)이 있거나 MONTH1, MONTH2, Month3, Month4가 어쩌면 다시이 열이 무엇을 나타내는 지 someother 방법을 전달할 것이다. –

+0

@Daniel, 피벗은 그가 원하는 것입니다. –

+0

질문이 너무 모호합니다. A/B의 날짜가 월 이름의 문자열로 표시되며 한 달에 한 번만 기록됩니까? A와 B에 걸쳐 12 개 이상의 레코드가 존재하지 않을 것인가? 그것은 분명하지 않지만 다른 Product + Location 조합이 있다고 생각합니까? C의 한 행이 A와 B의 여러 행으로 구성되어 있고 A/B의 어느 행이 데이터를 가져 왔는지에 따라 C에서 "A & B의 다른 열"을 어떻게 표시 할 계획입니까? – RichardTheKiwi

답변

2

이 내용은 SQL Server 2008 R2에서 테스트되었습니다. 나는 여기 모든 것이 2005 년에도 잘 될 것이라고 믿습니다. 2005 년, 내가 기억하는 한, PIVOT을 처음부터 끝까지 도입했습니다. 어떤 문제가 있으면 알려주세요.

DECLARE @Products TABLE 
(
    ID INT IDENTITY(1, 1) 
    , Name VARCHAR(30) 
); 

INSERT INTO @Products 
VALUES ('Dummies Guide to Querying'), ('SQL Design Patterns'); 

DECLARE @OldProducts TABLE 
(
    ID INT IDENTITY(1, 1) 
    , ProductID INT 
    , Location CHAR(2) 
    , HistoryDate DATE 
    , Sales INT 
); 

INSERT INTO @OldProducts 
VALUES (1, 'CO', '20100601', 100) 
    , (1, 'CO', '20100701', 200) 
    , (1, 'CA', '20100526', 150) 
    , (2, 'CA', '20100601', 175); 

DECLARE @NewProducts TABLE 
(
    ID INT IDENTITY(1, 1) 
    , ProductID INT 
    , Location CHAR(2) 
    , FutureDate DATE 
    , PredictedSales INT 
); 

INSERT INTO @NewProducts 
VALUES (1, 'CO', '20110401', 200) 
    , (1, 'CO', '20110601', 250) 
    , (1, 'CA', '20110401', 150) 
    , (2, 'CA', '20110301', 180) 
    , (3, 'WA', '20110301', 100); 

WITH AllProduts AS 
(
    SELECT 
     Products.Name 
     , OldProducts.Location 
     , DATENAME(MONTH, OldProducts.HistoryDate) AS MonthValue 
     , OldProducts.Sales 
    FROM @OldProducts AS OldProducts 
    INNER JOIN @Products AS Products 
     ON Products.ID = OldProducts.ProductID 

    UNION ALL 

    SELECT 
     Products.Name 
     , NewProducts.Location 
     , DATENAME(MONTH, NewProducts.FutureDate) AS MonthValue 
     , NewProducts.PredictedSales AS Sales 
    FROM @NewProducts AS NewProducts 
    INNER JOIN @Products AS Products 
     ON Products.ID = NewProducts.ProductID 
) 
SELECT 
    Name 
    , Location 
    , [January] 
    , [Febuary] 
    , [March] 
    , [April] 
    , [May] 
    , [June] 
    , [July] 
    , [August] 
    , [September] 
    , [October] 
    , [November] 
    , [December] 
FROM AllProduts 
PIVOT 
(
    SUM(Sales) 
    FOR MonthValue 
    IN 
    (
     [January] 
     , [Febuary] 
     , [March] 
     , [April] 
     , [May] 
     , [June] 
     , [July] 
     , [August] 
     , [September] 
     , [October] 
     , [November] 
     , [December] 
    ) 
) PivotedTable 
ORDER BY Name, Location; 
관련 문제