2013-06-09 7 views
2

동적 테이블 이름을 사용하여 피벗 테이블을 통해 테이블을 생성했습니다. 피벗의 결과는 임시 테이블 ## MyTable에 저장됩니다. 다음 샘플 열 및 데이터 ##을 MyTable의SQL의 다른 열을 기준으로 열 값 설정

구조 dFrom, DTO 제외

dFrom dTo 0 1800.00 1801.00 2400.00 2401.00 20000.00 
00:15 00:30 NULL 2.1  NULL  NULL  NULL  0 
00:30 00:45 NULL 2.1  NULL  NULL  NULL  0 
. 
. 
. 
02:00 02:15 NULL NULL  NULL  3.5  NULL  0 

이 모든 컬럼 0 20000.00는 동적이다.
이제는 인접한 열의 값을 NULL이 아닌 다른 값이 포함 된 열로 업데이트하는 것입니다. 예를 들어, 위의 경우 열 1801.00 & 2401.00 (동적 열) 00:15 - 00:30, 00:30 - 00:45 및 02:00 - 02:15의 행에 대해 각각 0으로 설정됩니다.
또한 [0] 열은 NULL이 아닌 값이 포함 된 열과 동일한 값을 포함해야합니다. 위의 경우와 마찬가지로 00:15 - 00:30 & 00:30 - 00:45 인 행의 경우 Column [0]에 2.1이 있어야합니다. 02:00 - 02:15 행의 경우 Column [0]에 3.5가 있어야합니다.

미리 감사드립니다.

COALESCE(dynamicColumn1, dynamicColumn2, etc) 

동적 문 : 컬럼에 대한

ISNULL(dynamicColumn1, 0)

[0] 당신이 COALESCE 기능을 사용할 수 있습니다 :

0으로 NULL을 대체 할 열의 경우
+0

** dFrom, dTo, 0 및 20000.00을 제외한 모든 열은 동적입니다. ** 열에 동적 이름을 지정하는 방법. –

+0

@EngineerDollery : 나는 그것을 얻지 못해 죄송합니다. (어떤 DB에 대해 이야기하고 있습니까?). SQL Server 기반 DB ... –

+0

동적으로 열을 정의하는 문을 표시 할 수 있습니까? –

답변

2

ISNULL 기능을 사용

DECLARE @PivotColumnHeadersForSelect varchar(max), 
        @PivotColumnHeadersForPivot varchar(max) 
SELECT @PivotColumnHeadersForSelect =  
  COALESCE(@PivotColumnHeadersForSelect + CASE WHEN [mPriceKW] = 0.00 THEN '[0.00]' ELSE ',ISNULL(['  
  + CAST([mPriceKW] as varchar(10)) + '], 0.0) AS [' + CAST([mPriceKW] as varchar(10)) + ']' END,  
  + CASE WHEN [mPriceKW] = 0.00 THEN '[0.00]' ELSE 'ISNULL([' + CAST([mPriceKW] as varchar(10))  
  + '], 0.0) AS [' + CAST([mPriceKW] as varchar(10)) + ']' END), 
       @PivotColumnHeadersForPivot = 
  COALESCE(@PivotColumnHeadersForPivot + ',[' + CAST([mPriceKW] as varchar(10)) + ']',  
  + '[' + CAST([mPriceKW] as varchar(10)) + ']')       
FROM PivotColumn 
GROUP BY [mPriceKW] 
ORDER BY [mPriceKW] ASC 

SET @PivotColumnHeadersForSelect = 
    REPLACE(@PivotColumnHeadersForSelect, '[0.00]', 'COALESCE(' + @PivotColumnHeadersForPivot + ') AS [0.00]') 
--SELECT @PivotColumnHeadersForSelect, @PivotColumnHeadersForPivot 

DECLARE @PivotTableSQL NVARCHAR(MAX)  
SET @PivotTableSQL = N'  
IF OBJECT_ID(''tempdb.dbo.##MyTable'') IS NOT NULL DROP TABLE dbo.##MyTable 
SELECT *  
INTO dbo.##MyTable 
FROM (SELECT dFrom, dTo, ' + @PivotColumnHeadersForSelect + ' 
      FROM (
            SELECT a.dFrom, a.dTo ,a.[mPriceKW] , a.fQuantumMW  
            FROM PivotColumn a  
            WHERE a.iBid = 1  
             ) TableDate  
PIVOT (min(fQuantumMW) FOR [mPriceKW] IN (' + @PivotColumnHeadersForPivot + ')  
     ) PivotTable) dt '  
--PRINT @PivotTableSQL       
EXECUTE(@PivotTableSQL) 

SELECT * 
FROM ##MyTable 

데모보기 SQLfiddle

+0

Alexander Fedorenko : dynamicColumn 이름을 알 수 없습니다. 그것의 동적. –

+0

@Dhruv Ganesh 나는 그걸 깨달았습니다 ... 그것은 동적 인 작성 문에 함수가 필요하다는 것을 보여줍니다. 컬럼을 동적으로 정의하는 문장을 보여 주시겠습니까? –

+0

DECLARE의 PivotColumnHeaders VARCHAR (MAX) SELECT PivotColumnHeaders = COALESCE ( PivotColumnHeaders + '['+ 캐스트 ([mPriceKW] VARCHAR 등 (10)) + ']'+ '['+ 캐스트 ([mPriceKW] VARCHAR로서 (10)) + ']) [mPriceKW]에 의해 순서

에서 ASC DECLARE PivotTableSQL NVARCHAR (MAX) SET PivotTableSQL = N' 선택 * ##을 MyTable 로 ( SELECT * 부터 ( a.dFrom, \t a.dTo, a. [mPriceKW], a.fQuantumMW를
에서 으로 선택하십시오.책 = '+ +' ) TableDate PIVOT ( 분 (fQuantumMW) [mPriceKW] IN ( '+ @PivotColumnHeaders +' ) ) 피벗) DT ' EXECUTE (@PivotTableSQL) –