2016-09-30 2 views
0

I는피봇 일

샘플 데이터가이 SQL과 유사한 일 코드

http://sqlfiddle.com/#!3/ca364/6

에 합산 값과 매핑 데이터를

하지만 내 문제는 내가이 예로 표시에 (위 sqlfiddle에서 쿼리를) 피벗 할 필요가 열 에 날짜 행을 돌리 수 없다

Date    1 2 3 4 5 6 7 8 9 to end of the month 
TAS0B065B999P999 0 0 0 0 0 4900 9900 0 -96600 
TAS1B065B999P999 0 0 0 0 0 0 0 0 0 
TAS2B065B999P999 0 0 0 0 0 0 0 0 0 
TAS3B065B999P999 0 0 0 0 0 0 0 0 0 
TAS4B065B999P999 0 0 0 0 0 0 0 0 0 
TAS5B065B999P999 0 0 0 0 0 0 0 0 0 
TAS6B065B999P999 0 0 0 0 0 0 0 0 0 
TAS7B065B999P999 0 0 0 0 0 0 0 0 0 
TAS8B065B999P999 0 0 0 0 0 0 0 0 0 
TAS9B065B999P999 0 0 0 0 0 0 0 0 0 
TASAB065B999P999 0 0 0 0 0 0 0 0 0 
TDS1B065B999P999 0 0 0 0 0 0 0 0 0 
TDS2B065B999P999 0 0 0 0 0 0 0 0 0 
TDS3B065B999P999 0 0 0 0 0 0 0 0 0 
TRS1B065B999P999 0 0 0 0 0 0 0 0 0 
TRS2B065B999P999 0 0 0 -72900 0 74900 -74900 90900 0 
TRS3B065B999P999 0 0 0 21100 0 0 0 0 0 

샘플 코드

WITH t1 
    AS (SELECT dt,TERM, 
       SumCashOUT, 
       DATEADD(MONTH, DATEDIFF(MONTH, '1900-01-01', dt), '1900-01-01') AS firstInMonth, 
       DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, '1900-01-01', dt)+1, '1900-01-01')) AS lastInMonth 
     FROM 
     (
      SELECT CONVERT( DATE, TA_DATE) AS dt,TERM, 
        DATENAME(dw, CONVERT(DATE, TA_DATE)) AS dn, 
        DATEPART(DW, CONVERT(DATE, TA_DATE)) AS dtdw, 
        OUT1 + OUT2 + OUT3 + OUT4 AS SumCashOUT 
      FROM CASH1609 

      GROUP BY TA_DATE, 
         TERM, 
         OUT1, 
         OUT2, 
         OUT3, 
         OUT4 
     ) AS st 
     GROUP BY dt,TERM, 
        dn, 
        dtdw, 
        SumCashOUT), 
    Calendar 
    AS (SELECT DISTINCT 
       DATEADD(Day, c.number, t1.firstInMonth) AS d 
     FROM t1 
       JOIN master..spt_values AS c ON type = 'P' 
               AND DATEADD(DAY, c.number, t1.firstInMonth) BETWEEN t1.firstInMonth AND t1.lastInMonth) 
    SELECT DATEPART(dd, d) AS Date,TERM, 

      CASE 
       WHEN CONVERT(NUMERIC(16, 0), SumCashOUT) IS NULL 
       THEN 0 
       ELSE CONVERT(NUMERIC(16, 0), SumCashOUT) 
      END AS SumCashOUT 
    FROM calendar AS c 
      LEFT JOIN t1 ON t1.dt = c.d 
      LEFT JOIN holiday ON c.d = holiday.HDATE 

    ORDER BY DAte ASC; 

답변

2

당신은 SQL Server의 PIVOT 명령을 사용해야합니다.

;WITH tab (TERM, DOM, CASH) AS 
(
    SELECT TERM, 
      DAY(CAST(TA_DATE AS DATE)) AS DOM, 
      OUT1 + OUT2 + OUT3 + OUT4 AS CASH 
    FROM CASH1609 
) 
SELECT * 
FROM tab 
PIVOT 
(
    SUM (CASH) 
    FOR DOM IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11], 
       [12],[13],[14],[15],[16],[17],[18],[19],[20],[21], 
       [22],[23],[24],[25],[26],[27],[28],[29],[30],[31]) 
) AS pvt 

은 "탭"CTE는 열 DOM (데이의-월)과 현금을 준비 :

원하는 출력을 제공합니다. PIVOT에는 집계 함수 (귀하의 경우에는 SUM)와 피벗 열의 가능한 값이 필요합니다.

참고 :이 그냥

SELECT TERM, COALESCE([1],0), COALESCE([2],0), etc... FROM tab... 
+0

가 마법처럼, 당신의 도움에 대한 귀하의 코드가 작동 감사

SELECT * FROM tab 

로 교체, 각 존재하지 않는 DOM에 대해 NULL을 전달합니다 :) –