2014-03-02 3 views
0

동적 열의 둥근 값과 관련된 질문이 있습니다.SQL Server : 동적 열의 라운드 값

나는 매일 (지난 X 일 동안) 매일 점수가 매겨진 플레이어 목록을 만드는 중이므로이 점수로 반올림하고 싶습니다. ROUND(Score, 2).

DECLARE @Column AS NVARCHAR(MAX), 
     @SQL AS NVARCHAR(MAX) 

SELECT [Player], [Start], [Average] 
INTO #DbTemp1 
FROM [PlayerScoreByWeek] 
WHERE [Start] >= DateAdd(DAY, -7, GETDATE()) 

SELECT @Column = STUFF((SELECT ',' + QUOTENAME([Start]) 
        FROM  #DbTemp1 
        GROUP BY [Start] 
        ORDER BY [Start] FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 

SET @SQL = 'SELECT [Player],' + @Column + ' 
       INTO #DbTemp2 
       FROM 
       (
        SELECT [Player], [Start], [Average] 
        FROM #DbTemp1 
       ) AS SourceTable 
       PIVOT 
       (
        AVG([Average]) 
        FOR [Start] IN (' + @Column + ') 
       ) AS PivotTable 
       ORDER BY Len([Player]), Player 
       SELECT * FROM #DbTemp2' 
EXECUTE(@SQL) 

전류 출력은 다음과 같다 : 여기 내 쿼리입니다

Player 2014-02-24 2014-02-25 2014-02-26 2014-02-27 2014-02-28 2014-03-01 2014-03-02 
------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- 
Carl  26.21654  55.1542  12.29612  29.16546  32.4556  21.1485  48.3652 
Gene  46.13444  29.3298  16.31642  12.86592  65.6235  52.8525  31.5915 
Kim  25.69554  39.5986  32.23184  34.55685  59.2125  12.2316  29.1242   

그리고이 원하는 출력 : 열이 생성되는 점을 감안

Player 2014-02-24 2014-02-25 2014-02-26 2014-02-27 2014-02-28 2014-03-01 2014-03-02 
------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- 
Carl  26.22   55.15  12.30   29.17   32.46   21.14  48.37 
Gene  46.13   29.33  16.32   12.87   65.62   52.85  31.59 
Kim   25.70   39.60  32.23   34.56   59.21   12.23  29.12 

동적으로하지 않습니다 '@SQL'쿼리 내에서 라운드 함수를 사용할 수 있습니다. 도움 주셔서 감사합니다.

답변

1

은 출력에 대한 또 다른 변수를 만듭니다 - 예를 :

DECLARE @Column AS NVARCHAR(MAX), @Output nvarchar(max), @SQL AS NVARCHAR(MAX) 

SELECT [Player], [Start], [Average] INTO #DbTemp1 FROM [PlayerScoreByWeek] 
WHERE [Start] >= DateAdd(DAY, -7, GETDATE()) 

SELECT @Column = STUFF((SELECT ','+ QUOTENAME([Start]) 
       FROM  #DbTemp1 
       GROUP BY [Start] 
       ORDER BY [Start] FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,''), 
     @Output = STUFF((SELECT ', round('+ QUOTENAME([Start])+',2) as ' + QUOTENAME([Start]) 
       FROM  #DbTemp1 
       GROUP BY [Start] 
       ORDER BY [Start] FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 


SET @SQL = 'SELECT [Player],' + @Output + ' 
      INTO #dbTemp2    
      FROM 
      (
       SELECT [Player], [Start], [Average] 
       FROM #DbTemp1 
      ) AS SourceTable 
      PIVOT 
      (
       AVG([Average]) 
       FOR [Start] IN (' + @Column + ') 
      ) AS PivotTable 
      ORDER BY Len([Player]), Player; 
      select * from #DbTemp2' 
EXECUTE(@SQL) 
+0

너무 감사합니다! 다른 변수를 만드는 것에 대해 생각하지 않았습니다. 그것은 위대한 작품! – Tdev