3

作成するピボットテーブルにトリックの問題があります:

次のようなテーブルがあります。

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, active" は name 列から取得され、値は nvarchar、date、int、および bit 列から取得されます。

更新: nvarchar、date、int、bit (および他のほとんどの SQL 形式) などの列には、実際にはこのタイプのデータが含まれています。列「タイプ」は、使用するデータを含む列を指定するため、「タイプ」が「1」の場合、「タイプ」が「3」の場合は「nvarchar」を使用するよりも「ビット」を使用するよりも" nvarchar ではなく、実際には少し含まれています。ピボットでは、「アクティブ」列の下にビットを置きたいのですが、例に「activation_date」などの 3 番目の列 (名前) がある場合、日付からの値 (タイプ = 2) を持つ 3 番目の列を表示したい桁。

私はこれで迷っています、助けてください

4

1 に答える 1

2

Assuming there's only one not null column for each row:

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

But I must warn you, this types of database schema is not best way to use SQL.

If you want to do this dynamically without hardcoding columns:

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

If you have some Mapping table like this:

name       value
--------------------
name       nvarchar
active     bit

you can use this query:

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

于 2013-09-17T12:38:13.500 に答える