2014-07-18 4 views
0

나는이 나는이 '실제'행을 피벗이 쿼리를 생성피벗 해제 데이터 - 구문 제발 도와주세요

enter image description here

피벗 해제하고 싶지만에 보이지 않을 수있는 다음과 같은 데이터 'Plan'과 'PriorYear'를 unpivoting하기위한 구문을 찾아야합니다.

SELECT FiscalYear, Period, MetricName, ActualValue 
FROM vw_ExecSummary 
UNPIVOT 
(ActualValue FOR MetricName IN ([Net Revenue], [Total C.S. Salaries] 
)) AS unpvt 
WHERE [Type] = 'Actual' 

피봇 팅 데이터는 다음과 같습니다 그러나 나는 또한 크게 감상 할 수

enter image description here

어떤 도움 아래 ActualValue 컬럼의 오른쪽에있는 계획 및 PriorYear 열을 추가하고 싶습니다. 감사.

답변

1

나는 이것을 지금 시험 할 수는 없지만, 나는 이것이 이처럼 작동한다고 생각한다.

SELECT fiscalYear, period, type, metricName, metricValue 
FROM vw_ExecSummary 
UNPIVOT (metricValue FOR metricName IN ([Net Revenue], [Total C.S. Salaries])) unpvt 

같은 것을 보이는 테이블을 초래할한다 : 첫째, 당신은 UNPIVOT모든 데이터에 필요한

fiscalYear period type  metricName    metricValue 
=================================================================== 
15   1  'Actual' 'Net Revenue'   3676798.98999997 
15   1  'Actual' 'Total C.S. Salaries' 1463044.72 
15   1  'Plan' 'Net Revenue'   3503920.077405 
...................... (remaining rows omitted) 

을 우리는 정상적으로 PIVOT 행은 새를 얻을 수 열 (즉, 위해의 기능) :

SELECT fiscalYear, period, metricName, 
     [Actual] AS actualValue, [Plan] AS planValue, [PriorYear] AS priorYearValue 
FROM <previous_data> 
PIVOT (SUM(metricValue) FOR (type IN ([Actual], [Plan], [PriorYear]) pvt 

합니다 (SUM(...)가 실제로을하지 말아야 그래서 퍼팅

fiscalYear period metricName  actualValue  planValue  priorYearValue 
====================================================================================== 
15   1  'Net Revenue' 3676798.98999997 3503920.077405 40436344.4499999 
...................................... (remaining rows omitted) 

: 상정으로 다른 열은 고유 한 행을 포함하지만, 우리는 다음에 가깝다 뭔가를 양보해야한다 집계 함수)

를 ... 사용하는 데 필요하고, 여기 ything 함께 같을 것이다 :

SELECT fiscalYear, period, metricName, 
     [Actual] AS actualValue, [Plan] AS planValue, [PriorYear] AS priorYearValue 
FROM (SELECT fiscalYear, period, type, metricName, metricValue 
     FROM vw_ExecSummary 
     UNPIVOT (metricValue FOR metricName IN ([Net Revenue], [Total C.S. Salaries])) unpvt) unpvt 
PIVOT (SUM(metricValue) FOR type IN ([Actual], [Plan], [PriorYear])) AS pvt 

SQL Fiddle Example


는 그래도 한 관심을 가지고 값 등 3676798.98999997, 3503920.077405처럼, 나를 생각하게하는 열입니다 부동 소수점 (즉, REAL 또는 FLOAT), 그러나 값이 통화 사용에 대한 이름이 지정됩니다. 이 경우에 ... 인식 부동 소수점 값은 정확히 .1과 같은 것을 저장할 수 없습니다 (즉, 값에 실제로 십센트를 추가 할 수 없습니다)? 그리고 값이 충분히 커지면 더 이상 1을 추가 할 수 없습니까? 보통 화폐 가치를 다룰 때는 DECIMAL 또는 NUMERIC과 같은 고정 소수점 유형을 기반으로하는 것을 사용해야합니다.

+0

감사 솔루션에 대한 -에 자리! PIVOT 문에서 'type'단어가 올바르지 않기 전에 괄호를 사용했음을 알았습니다.나는 그것을 제거하고 PIVOT 명령문 끝에 닫는 괄호를 추가했다. 매력처럼 일 했어! – Jason

+0

@ Jason - 아, 고마워. # corrected #. 이런 이유로 나는 그들을 먼저 시험하고 싶다. 그래서 두 개의 돈 열의 유형은 무엇입니까? –

+0

나는 타입이 플로트 (지금 나의 랩탑 앞에 없다)라고 생각한다. – Jason

0

Itzig Ben-Gan's cross apply values pivoting의 상황 :

create table #data (FiscalYear smallint, Period tinyint, ValueType nvarchar(25), NetRevenue float, Salaries float); 
insert into #data values 
    (15,1,N'Actual',3676798.98999,1463044.71999), 
    (15,1,N'Plan',3503920.977405,1335397.32878), 
    (15,1,N'PriorYear',4043634.449,1543866.89); 

select d.FiscalYear, d.Period, 
     ActualNetRevenue = sum(v.ActualNetRevenue), ActualSalaries = sum(v.ActualSalaries), 
     PlanNetRevenue = sum(v.PlanNetRevenue), PlanSalaries = sum(v.PlanSalaries), 
     PriorYearNetRevenue = sum(v.PriorYearNetRevenue), PriorYearSalaries = sum(v.PriorYearSalaries) 
from #data d 
cross apply 
     (values 
     (N'Actual',d.NetRevenue,d.Salaries,0,0,0,0), 
     (N'Plan',0,0,d.NetRevenue,d.Salaries,0,0), 
     (N'PriorYear',0,0,0,0,d.NetRevenue,d.Salaries)) 
     v (ValueType, ActualNetRevenue, ActualSalaries, PlanNetRevenue, PlanSalaries, PriorYearNetRevenue, PriorYearSalaries) 
where d.ValueType = v.ValueType 
group by d.FiscalYear, d.Period; 

drop table #data; 
+0

감사하지만이 예제는 모든 항목을 한 행에 넣습니다. 위의 해결책은 내가하고자하는 일입니다. – Jason

관련 문제