2013-01-04 168 views
0
Table - T1 (id, Description) 
Table - T2 (id, fk_id,Dates, Amount) 

select d.Description,dt.Dates,dt.Amount 
from T2 as dt join T1 d 
    on 
d.id = dt.fk_id 
group by d.Description,dt.Dates,dt.Amount 

上面的查詢結果運行顯示以下排列在SQL Server 2008

Description  Dates   Amount 
nutrition1  2012-01-01  100.00 
nutrition1  2013-01-01  100.00 
nutrition2  2012-01-01  100.00 
nutrition2  2013-01-01  600.00 
nutrition3  2012-01-01  300.00 
nutrition3  2013-01-01  700.00 
nutrition4  2012-01-01  400.00 
nutrition4  2013-01-01  800.00 
nutrition5  2012-01-01  300.00 
nutrition5  2013-01-01  600.00 

我想顯示的結果

Description 01-01-2012 01-01-2013 
nutrition1  100   100 
nutrition2  100   600 
nutrition3  300   700 
nutrition4  400   800 
nutrition5  300   600 

日期將改變

+0

您可以使用'XML路徑' –

回答

2

這轉化類型是PIVOT。如果你提前知道的值的時候,你可以硬編碼它們與此類似:

select * 
from 
(
    select d.Description,convert(char(10), dt.dates, 110) dates,dt.Amount 
    from T2 as dt 
    join T1 d 
    on d.id = dt.fk_id 
) src 
pivot 
(
    sum(amount) 
    for dates in ([01-01-2012], [01-01-2013]) 
) piv 

SQL Fiddle with Demo

如果您有未知的值進行改造,那麼你將要使用動態SQL:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(char(10), dates, 110)) 
        from T2 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT Description, ' + @cols + ' from 
      (
       select d.Description,convert(char(10), dt.dates, 110) dates,dt.Amount 
       from T2 as dt 
       join T1 d 
        on d.id = dt.fk_id 
      ) x 
      pivot 
      (
       sum(amount) 
       for dates in (' + @cols + ') 
      ) p ' 

execute(@query) 

SQL Fiddle with Demo

兩個版本產生相同的結果:

| DESCRIPTION | 01-01-2012 | 01-01-2013 | 
----------------------------------------- 
| nutrition1 |  100 |  100 | 
| nutrition2 |  100 |  600 | 
| nutrition3 |  300 |  700 | 
| nutrition4 |  400 |  800 | 
| nutrition5 |  300 |  600 | 
+0

謝謝bluefeet – Subin

0
SELECT Description, 
    SUM(
    CASE 
    WHEN dt.Dates=to_date('01-01-2012','dd-mm-yyyy') 
    THEN dt.Amount 
    ELSE 0 
    END) AS '01-01-2012' , 
    SUM(
    CASE 
    WHEN dt.Dates=to_date('01-01-2013','dd-mm-yyyy') 
    THEN dt.Amount 
    ELSE 0 
    END) '01-01-2013' 
FROM T2 AS dt 
JOIN T1 d 
ON d.id = dt.fk_id 
GROUP BY d.Description; 
+1

來完成感謝您的回覆,但日期會改變。 – Subin