2011-05-04 5 views
6

나는 이와 같은 질문을 보지 못했지만 거기에 답변이있는 경우 저에게 알려주십시오.여러 동적 피벗 테이블에 가입

저장 프로 시저를 사용하여 내보내기를 만들어야합니다. 유감스럽게도 현재 SSRS에서이 보고서를 작성하는 것은 불가능합니다.

필자가해야 할 일은 동적으로 피벗 테이블을 만들어 다른 테이블과 결합하는 것입니다.

원시 데이터는 다음과 유사 작품 (내 회사의 데이터를 보호하기 위해 항목을 변경했습니다) :

Data Sample

들이 데이터가 보고서가이 (공간을 절약하는 것입니다에 같이 할 무엇 모든 날짜를 사용하지는 않았지만 아이디어를 얻을 수 있습니다.) Report Sample

임시 테이블을 만들고 두 개의 동적 피벗 테이블을 만들었습니다. 두 테이블 모두 별도로 작동하지만 UNION ALL을 사용하면 오류 메시지가 나타납니다 (아래에서 추가 할 것입니다). 두 개의 피벗을 만드는 데 사용한 코드를 포함합니다. 누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까?

하나의 피벗에서만이 작업을 수행 할 수 있습니까?

경고 : 내가받을

/* 
    Use dynamic SQL to find all 
    Issue Dates for column headings 
*/ 
DECLARE @Jquery VARCHAR(8000) 
DECLARE @query VARCHAR(4000) 
DECLARE @years VARCHAR(2000) 
SELECT @years = STUFF((SELECT DISTINCT 
         '],[' + 'Item 1' + ' ' + (IssueDate) 
         FROM #GroupData GroupData 
         ORDER BY '],[' + 'Item 1' + ' ' + (IssueDate) 
         FOR XML PATH('') 
         ), 1, 2, '') + ']' 

SET @query = 
'SELECT * FROM 
(
    SELECT LocationID, StoreName, StoreState AS State, "Item 1" + " " + (IssueDate) AS IssueDate, MoneyOrder 
    FROM #GroupData GroupData 
) MoneyOrderIssued 
PIVOT (MAX(MoneyOrder) FOR IssueDate 
IN ('[email protected]+')) AS pvt' 

DECLARE @queryMOUsed VARCHAR(4000) 
DECLARE @MOUsedYear VARCHAR(2000) 
SELECT @MOUsedYear = STUFF((SELECT DISTINCT 
         '],[' + 'Item 2' + ' ' + (IssueDate) 
         FROM #GroupData GroupData 
         ORDER BY '],[' + 'Item 2' + ' ' + (IssueDate) 
         FOR XML PATH('') 
         ), 1, 2, '') + ']' 

SET @queryMOUsed = 
'SELECT * FROM 
(
    SELECT LocationID, StoreName, StoreState AS State, "Item 2" + " " + (IssueDate) AS IssueDate, MOUsed 
    FROM #GroupData GroupData 
)SCRMoneyOrders 
PIVOT (MAX(MOUsed) FOR IssueDate 
IN ('[email protected]+')) AS pvt' 

SET @Jquery = @query + ' UNION ALL ' + @queryMOUsed 


EXECUTE (@query) -- Only in here to show that this works w/out UNION ALL 
EXECUTE (@queryMOUsed) -- Only in here to show that this works w/out UNION ALL 

EXECUTE (@Jquery) 

오류 메시지는 다음과 Null 값이 집계 또는 다른 SET 연산에 의해 제거된다. 메시지 8114, 수준 16, 상태 5, 줄 1 데이터 형식을 varchar에서 bigint로 변환하는 중 오류가 발생했습니다.

답변

6

제 아이디어는 열 수 (열 수, 열 순서 및 데이터 형식)가 일치하지 않는다는 것입니다. 귀하의 질문을 올바르게 읽는다면, item1과 item2의 발행일이 일치하지 않으면 어쨌든 불일치 열이 나타날 수 있습니다. 이 두 쿼리의 결과를 보지 않고도 말하기는 정말 어렵습니다.

상점 ID를 기반으로하는 JOIN을 원하지 않습니까? 같은

뭔가 : 여기

WITH Item1Data as (
--pivot query for item 1 
), 
Item2Data as (
--pivot query for item 2 
) 
SELECT columns 
FROM Item1DATA i1 
LEFT JOIN Item2Data i2 
ON i1.SoteID = i2.StoreID 

은 내가 한 동적 쿼리입니다. 열이 데이터 생성 됨 :

--Get string of aggregate columns for pivot. The aggregate columns are the last 5 NRS Years. 
        DECLARE @aggcols NVARCHAR(MAX) 

        SELECT @aggcols = STUFF((SELECT '],[' 
                 + CAST(ny2.NRS_YEAR AS CHAR(4)) 
               FROM  mps.NRS_YEARS ny2 
               WHERE ny2.NRS_YEAR BETWEEN @NRS_Year 
                 - 5 AND @NRS_Year 
               ORDER BY '],[' 
                 + CAST(ny2.NRS_YEAR AS CHAR(4)) 
              FOR 
               XML PATH('')) , 1 , 2 , '') 
          + ']' ; 

--While we're at it, get a sum of each year column. we'll do a union query instead of rollup because that's how we roll. 

        DECLARE @sumcols NVARCHAR(MAX) ; 
        SELECT @sumcols = STUFF((SELECT ']),sum([' 
                 + CAST(ny2.NRS_YEAR AS CHAR(4)) 
               FROM  mps.NRS_YEARS ny2 
               WHERE ny2.NRS_YEAR BETWEEN @NRS_Year 
                 - 5 AND @NRS_Year 
               ORDER BY ']),sum([' 
                 + CAST(ny2.NRS_YEAR AS CHAR(4)) 
              FOR 
               XML PATH('')) , 1 , 3 , '') 
          + '])' ; 

        DECLARE @Query NVARCHAR(MAX) ; 
--Construct dynamic pivot query 

        SET @Query = N'SELECT MonthName as Month, ' + @aggcols 
         + N' 
     into ##MonthHourPivot 
FROM 
(SELECT nc.MONTHNAME, nc.MonthOfNRS_Yr, nc.NRS_YEAR, st.Hours 
FROM mps.NRS_Calendar nc 
INNER JOIN dbo.StudentTime st 
ON nc.Date = /*00:00:00 AM*/ DATEADD(dd, DATEDIFF(dd, 0, /*On*/ st.EntryDateTime), 0) 
LEFT JOIN mps.vw_ScheduleRoomBuilding srb 
ON st.ScheduleID = srb.ScheduleID 
WHERE (st.EntryDateTime <= GETDATE() and st.SiteCode = ''' + @SiteCode 
         + N''' or ''' + @SiteCode + N''' = ''All'') 
AND (srb.Abbreviation = ''' + @Building + N''' or ''' + @Building 
         + N''' = ''All'')) p 
PIVOT 
(
sum(p.Hours) 
FOR NRS_Year IN 
(' + @aggcols + N') 
) AS pvt 
' ; 

--Execute It. 
        EXECUTE(@Query) ; 

        SET @Query = N'Select [Month], ' + @aggcols 
         + N'FROM ##MonthHourPivot UNION ALL SELECT ''Total'' as [Month], ' 
         + @sumcols + ' FROM ##MonthHourPivot' ; 
        Execute (@Query); 
+0

네가 맞다고 생각해, 네이트. DBA는 방금 두 개의 서로 다른 열 유형을 배치하려고한다는 것을 지적했습니다 (5 분 전). 그녀는이 시간에 날짜 조합을 사용하여 다양한 항목을 피벗하는 방법에 대한 대답을 가지고 있지 않았습니다. 이견있는 사람? – DataGirl

+0

방금 ​​업데이트했습니다. – NateMpls

+1

또 다른 질문입니다. 항목을 동적으로 생성해야합니까? – NateMpls

0

이것은 ETL 도구로보다 적절하게 수행 된 것처럼 보입니다.

Microsoft 도구 세트를 잘 모르지만 데이터웨어 하우징 패키지에이 도구가 포함되어 있다고 가정합니다. Pentaho의 "데이터 통합"(주전자)에서는 row denormalizer step 또는 row flattener step을 사용합니다.

+0

답변 해 주셔서 감사합니다. 불행히도 ETL을 사용할 수 없습니다. 이 피벗 테이블을 사용하여 빌드 할 저장 프로 시저가 기존 제품으로 가져옵니다. – DataGirl