我有一个数据透视表的技巧问题:
我有一张表格如下:
id table object name type nvarchar date int bit
1 1 2 name 1 tables NULL NULL NULL
2 1 2 name 1 columns NULL NULL NULL
3 1 2 name 1 datatypes NULL NULL NULL
4 1 2 name 1 _users NULL NULL NULL
1 1 3 active 3 NULL NULL NULL 1
2 1 3 active 3 NULL NULL NULL 1
3 1 3 active 3 NULL NULL NULL 1
4 1 3 active 3 NULL NULL NULL 1
输出应如下所示:
id name active
1 tables 1
2 columns 1
3 datatypes 1
4 _users 1
基于"类型"我应该从列中输入正确的数据,这些列在nvarchar,bit,datetime,int等格式化。
" id"是行ID,"名称,活动"来自name列和来自nvarchar,date,int和bit列的值。
更新:像nvarchar,date,int和bit(以及大多数其他SQL格式)这样的列实际上包含这种类型的数据。列"类型"给出哪一列包含要使用的数据,所以如果"键入"是" 1",比我想使用" nvarchar"如果"键入"是" 3"比我想要使用" bit"它包含真的有点而不是nvarchar。在Pivot中,我希望将该位置于" active"如果我在示例中有第3列(名称),例如" activation_date"我想从日期列中看到第三列的值(type = 2)。
我迷失了,请帮忙
答案 0 :(得分:1)
假设每行只有一个非空列:
with cte as (
select
id,
name,
coalesce(
[nvarchar],
convert(nvarchar(max), [date], 120),
cast([int] as nvarchar(max)),
cast([bit] as nvarchar(max))
) as value
from Table1 as t
)
select
id,
max(case when [name] = 'name' then value end) as [name],
max(case when [name] = 'active' then value end) as [active]
from cte
group by id
<强> sql fiddle demo 强>
但是我必须警告你,这种类型的数据库模式不是使用SQL的最佳方式。
如果您想在没有硬编码列的情况下动态执行此操作:
declare @stmt nvarchar(max)
select @stmt =
isnull(@stmt + ', ', '') +
'max(case when [name] = ''' + name + ''' then value end) as ' + quotename([name])
from (select distinct [name] from Table1) as t
select @stmt = '
with cte as (
select
id,
name,
coalesce(
[nvarchar],
convert(nvarchar(max), [date], 120),
cast([int] as nvarchar(max)),
cast([bit] as nvarchar(max))
) as value
from Table1 as t
)
select
id, ' + @stmt + '
from cte
group by id
'
exec sp_executesql
@stmt = @stmt
<强> sql fiddle demo 强>
如果您有一些Mapping
表,请执行以下操作:
name value
--------------------
name nvarchar
active bit
您可以使用此查询:
declare @stmt nvarchar(max)
select @stmt =
isnull(@stmt + ', ', '') +
'max(case when [name] = ''' + name + ''' then [' + value + '] end) as ' + quotename([name])
from Mapping
select @stmt = '
select
id, ' + @stmt + '
from Table1
group by id
'
exec sp_executesql
@stmt = @stmt
<强> sql fiddle demo 强>