-1

テーブル Tbl_Login があります

Cat_ID int
金額1小数
金額2小数
金額 3 桁
日付オン日付


Cat_ID 金額 1 金額 2 金額 3 日付
1 10 12 12 2013-02-12
2 10 12 12 2013-02-12
3 10 12 12 2013-02-12
4 10 12 12 2013-02-12

1 20 22 22 2013-02-13
2 20 22 22 2013-02-13
3 20 22 22 2013-02-13
5 20 22 22 2013-02-13
I want To Mamber Enter Two Date 12/02/2013 15/02/2013 と

colum1 Cat_ID 12-02-2013 13-02-2013 14-02-2013 15-02-2013
金額1 1 10 20 null null    
金額2 1 12 22 null null
金額3 1 12 22 null null    

金額1 2 10 20 null null    
金額2 2 12 22 null null
金額3 2 12 22 null null    

金額1 3 10 20 null null    
金額2 3 12 22 null null
金額3 3 12 22 null null    

金額1 4 10 null null null    
金額2 4 12 null null null
金額3 4 12 null null null    

金額1 5 null 20 null null    
金額 2 5 null 22 null null
Amount3 5 null 22 null null  

4

1 に答える 1

4

使用している RDBMS を指定しませんでしたが、このデータを必要な結果に変換する方法がいくつかあります。

PIVOT関数を持たないデータベースを使用している場合は、UNION ALLクエリを使用してデータのピボットを解除し、集計関数とCASE式を使用して日付を列にピボットすることでこれを行うことができます。クエリは次のようになります。

select col, 
  cat_id,
  max(case when dateon = '2013-02-12' then value end) [2013-02-12],
  max(case when dateon = '2013-02-13' then value end) [2013-02-13],
  max(case when dateon = '2013-02-14' then value end) [2013-02-14],
  max(case when dateon = '2013-02-15' then value end) [2013-02-15]
from
(
  select cat_id, 'amount1' col, amount1 value, dateon
  from tbl_login
  where dateon >= '2013-02-12'
    and dateon <= '2013-02-15'
  union all
  select cat_id, 'amount2' col, cast(amount2 as decimal(10,2)) value, dateon
  from tbl_login
  where dateon >= '2013-02-12'
    and dateon <= '2013-02-15'
  union all
  select cat_id, 'amount3' col, cast(amount3 as decimal(10,2)) value, dateon
  from tbl_login
  where dateon >= '2013-02-12'
    and dateon <= '2013-02-15'
) src
group by col, cat_id
order by cat_id, col

デモで SQL Fiddle を参照してください

SQL Server 2005 以降または Oracle 11g 以降を使用している場合は、UNPIVOTPIVOT関数の両方を使用できます。

select col, cat_id,
  [2013-02-12], [2013-02-13], 
  [2013-02-14], [2013-02-15]
from
(
  select cat_id, dateon,
    col, value
  from
  (
    select cat_id, amount1, 
      cast(amount2 as decimal(10,2)) amount2, 
      cast(amount3 as decimal(10,2)) amount3, 
      dateon
    from tbl_login
    where dateon >= '2013-02-12'
      and dateon <= '2013-02-15'
  ) s
  unpivot
  (
    value
    for col in (Amount1, Amount2, Amount3)
  ) unpiv
) src
pivot
(
  max(value)
  for dateon in ([2013-02-12], [2013-02-13], 
                 [2013-02-14], [2013-02-15])
) piv
order by cat_id, col

SQL Fiddle with Demoを参照してください。

列に変換したい日付の数が不明な場合は、動的SQLを使用できます(注:動的コードはSQLサーバーの構文です):

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @startdate datetime,
    @enddate datetime

set @startdate  ='2013-02-12'
set @enddate  ='2013-02-15'

;with dates (dt) as
(
  select @startdate
  union all
  select dateadd(dd, 1, dt)
  from dates
  where dateadd(dd, 1, dt) <= @enddate
)
select dt
into #temp
from dates

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(varchar(10), dt, 120)) 
                    from #temp
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT col, cat_id,' + @cols + ' 
            from
            (
              select cat_id, dateon,
                col, value
              from
              (
                select cat_id, amount1, 
                  cast(amount2 as decimal(10,2)) amount2, 
                  cast(amount3 as decimal(10,2)) amount3, 
                  dateon
                from tbl_login
                where dateon >= '''+convert(varchar(10), @startdate, 120)+'''
                  and dateon <= '''+convert(varchar(10), @enddate, 120)+'''
              ) s
              unpivot
              (
                value
                for col in (Amount1, Amount2, Amount3)
              ) unpiv
            ) src
            pivot
            (
              max(value)
              for dateon in (' + @cols + ')
            ) p 
            order by cat_id, col'

execute(@query)

デモで SQL Fiddle を参照してください

すべてのクエリの結果は次のとおりです。

|     COL | CAT_ID | 2013-02-12 | 2013-02-13 | 2013-02-14 | 2013-02-15 |
------------------------------------------------------------------------
| amount1 |      1 |         10 |         20 |     (null) |     (null) |
| amount2 |      1 |         12 |         22 |     (null) |     (null) |
| amount3 |      1 |         12 |         22 |     (null) |     (null) |
| amount1 |      2 |         10 |         20 |     (null) |     (null) |
| amount2 |      2 |         12 |         22 |     (null) |     (null) |
| amount3 |      2 |         12 |         22 |     (null) |     (null) |
| amount1 |      3 |         10 |         20 |     (null) |     (null) |
| amount2 |      3 |         12 |         22 |     (null) |     (null) |
| amount3 |      3 |         12 |         22 |     (null) |     (null) |
| amount1 |      4 |         10 |     (null) |     (null) |     (null) |
| amount2 |      4 |         12 |     (null) |     (null) |     (null) |
| amount3 |      4 |         12 |     (null) |     (null) |     (null) |
| amount1 |      5 |     (null) |         20 |     (null) |     (null) |
| amount2 |      5 |     (null) |         22 |     (null) |     (null) |
| amount3 |      5 |     (null) |         22 |     (null) |     (null) |
于 2013-02-15T16:29:00.010 に答える