2012-07-21 4 views
0

MS Access CrossTab 쿼리를 T-SQL로 변환하여 SQL2000이나 Linq-to-SQL로 변환하는 방법을 알아 내려고 정말 고심하고 있습니다.SQL 2000 TSQL - 피벗 테이블 만들기

Access Cross Tab Query 그리고이 생산 : 항목 ID 및을 StoreID에 의해 Access Cross Tab Query Results

쿼리는 기본적으로 그룹과 수량이 판매 금액,하지만 Access에서 크로스 탭 쿼리와 내가해야하는 것은 Access에서 다음과 같습니다 쿼리입니다 , 각 행에 대해 고유 한 ItemID, 각 StoreID에 대한 열 및 값으로 각 StoreID/ItemID 조합에 대한 Qty를 가질 수 있습니다.

T-SQL 2000에서 어떻게 구성합니까? 그룹화를 사용하여 간단한 select 쿼리를 작성할 수 있지만 StoreID, ItemID 및 Qty의 세 열로 나에게 데이터를 제공합니다. 이 데이터를 변환

는하지만 정말해야 할 것은

enter image description here

:하지만 제가 필요한 것은 생산

SELECT  Trans.TranSID as StoreID, TransDetail.TranItemID as ItemID, SUM(TransDetail.Qty) AS TotalQtyForStore 
    FROM   Trans INNER JOIN 
          TransDetail ON Trans.TranID = TransDetail.TranID INNER JOIN 
          Item ON TransDetail.TranItemID = Item.ItemID 
    WHERE  (Trans.TranDate > CONVERT(DATETIME, '2005-01-01 00:00:00', 102)) AND (Trans.TranTypeID = 'so' OR 
          Trans.TranTypeID = 'ca') AND (Trans.TranStatus <> 'v') AND (Item.ItemClassID = 'RHM') 
    GROUP BY Trans.TranSID, TransDetail.TranItemID 

설정 항목 ID에 대한 열 및 결과의 모든을 StoreID에 대한 열이 있습니다 StoreID 값은 위의 Access CrossTab 쿼리와 마찬가지로 열이됩니다.

+0

일반적으로 SQL에서는이 작업을 수행하지 않을 것이므로 사용중인 모든보고 도구에서 크로스 탭을 수행 할 것입니다. 예를 들어보고 서비스를 사용하면 상대적으로 간단합니다. – Bert

+0

동의합니다. 그것은 단지 이런 식으로 접근하는 데 2 ​​초가 걸리지 만 나는 T-SQL이나 Linq-to-SQL로는 이해할 수 없다는 말을 듣는다. –

답변

0

전적으로 저장소 (TranSID) 값을 미리 알지 못하기 때문에 동적 SQL을 사용하여이 작업을 수행합니다. 이 저장 프로시 저는 시작/종료 날짜를 매개 변수로 사용하고 크로스 탭을 생성합니다. 아마도 TranStatus 및 ItemClassID와 같은 다른 것들도 매개 변수화 할 수 있지만 쿼리에서 고정 요소 또는 가변 요소인지 여부는 분명하지 않습니다.

CREATE PROCEDURE dbo.CrossTabByItem 
    @StartDate DATETIME, 
    @EndDate DATETIME = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SET @EndDate = COALESCE(DATEADD(DAY, 1, @EndDate), GETDATE()); 

    DECLARE @sql NVARCHAR(4000); SET @sql = N''; 

    SELECT @sql = @sql + ', 
    [' + TranSID + '] = SUM(CASE WHEN t.TranSID = ''' 
    + TranSID + ''' THEN td.Qty ELSE 0 END)' FROM 
    (
     SELECT DISTINCT TranSID FROM dbo.Trans 
     WHERE TranDate >= @StartDate AND TranDate < @EndDate 
    ) AS x ORDER BY TranSID; 

    SET @sql = N'SELECT ItemID = td.TranItemID' + @sql + ' 
     FROM dbo.Trans AS t 
     INNER JOIN dbo.TransDetail AS td 
     ON t.TranID = td.TranID 
     INNER JOIN dbo.Item AS i 
     ON td.TranItemID = i.ItemID 
     WHERE t.TranDate >= @StartDate 
     AND t.TranDate < @EndDate 
     AND t.TranTypeID IN (''so'',''ca'') 
     AND t.TranStatus <> ''v'' 
     AND i.ItemClassID = ''RHM'' 
     GROUP BY td.TranItemID;'; 

    EXEC sp_executesql @sql, 
     N'@StartDate DATETIME, @EndDate DATETIME', 
     @StartDate, @EndDate; 
END 
GO 

그래서 당신은 지금까지 1 월 1 일, 2005 년부터 모든 것을 얻으려면, 다음과 같이 호출 할 수 있습니다 :

EXEC dbo.CrossTabByItem @StartDate = '20050101'; 

또는 같은

은 2005 년의 단지 월 얻을 :

EXEC dbo.CrossTabByItem @StartDate = '20050101', @EndDate = '20050131'; 
+0

저장 프로 시저를 생성하여 실행했지만 오류가 발생합니다. "키워드 'GROUP'근처의 구문이 올바르지 않습니다. –

+0

죄송합니다. 불필요한 대괄호로 인해 부주의 한 오자가 발생합니다. 지금 시도하십시오. –

+0

밤! 그것은 그것을 얻었다. 나는 기절하고 겸손 해졌다. 나는 ClassID를 매개 변수화 할 것이고 이것은 갈 것이 좋다. 대단히 감사합니다!!! –