sql中的数据透视表联接
我有表Tbl_登录 Cat_ID int Amount1 decimal Amount2 decimal Amount3 decimal dateon date Cat_ID Amount1 Amount2 Amount3 dateon 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 and colum1 Cat_ID 12-02-2013 13-02-2013 14-02-2013 15-02-2013 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 Cat_ID int 小数位数1 小数位数2 十进制数3 约会 类别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 我想输入两个日期:2013年2月12日2013年2月15日和 colum1类别识别号12-02-2013 13-02-2013 14-02-2013 15-02-2013 数量1 10 20空 数量2 1 12 22空 金额3 1 12 22空 数量1 2 10 20空 数量2 12 22空 数量3 2 12 22空 金额1 3 10 20空 数量2 3 12 22空 金额3 3 12 22空 数量1 4 10零零零零零零 数量2 4 12空空空空 数量3 4 12空空空空 数量1 5空20空 数量2 5空22空 数量3 5空22空sql中的数据透视表联接,sql,pivot-table,Sql,Pivot Table,我有表Tbl_登录 Cat_ID int Amount1 decimal Amount2 decimal Amount3 decimal dateon date Cat_ID Amount1 Amount2 Amount3 dateon 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
您没有指定正在使用的RDBMS,但有几种方法可以将这些数据转换为所需的结果 如果您使用的数据库没有
PIVOT
函数,则可以通过使用UNION ALL
查询来取消数据的PIVOT,然后使用带有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(注意:动态代码是sql server语法):
列“amount1”的类型与UNPIVOT列表中指定的其他列的类型冲突。这些列上的数据类型是什么?如果是十进制,精度和长度是多少?amount1 decimal(10,2),amount1 smallInt
amount1
如何有两种不同的数据类型?您的OP将它们全部显示为decimal
?@anildigiwal那么,它是哪一个?,amount1
是十进制还是小整数?。如果不是十进制
,那么您应该用正确的信息更新您的问题
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
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)
| 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) |