C# 如何将数据从行组合到列

C# 如何将数据从行组合到列,c#,sql,sql-server-2008,C#,Sql,Sql Server 2008,我有这样的结构。尝试创建动态表 create table indicator(id int not null,name varchar(255) not null) insert indicator (id, name) values (1, 'basic employee details') create table fields( id int identity(1,1) not null, type int, name varchar(255) not null, parentid

我有这样的结构。尝试创建动态表

create table indicator(id int not null,name varchar(255) not null)
insert indicator (id, name) values (1, 'basic employee details')

create table fields(
id int identity(1,1) not null,  
type int,
name varchar(255) not null,
parentid int not null)

insert fields (id, type, name, parentid) values (1, 1, 'year', 0)
insert fields (id, type, name, parentid) values (2, 2, '2010', 1)
insert fields (id, type, name, parentid) values (5, 2, '2011', 1)
insert fields (id, type, name, parentid) values (6, 2, '2012', 1)
insert fields (id, type, name, parentid) values (7, 2, '2013', 1)
insert fields (id, type, name, parentid) values (8, 2, '2014', 1)
insert fields (id, type, name, parentid) values (9, 1, 'nationality', 0)
insert fields (id, type, name, parentid) values (10, 1, 'bahrani', 9)
insert fields (id, type, name, parentid) values (11, 1, 'non bahrani', 9)
insert fields (id, type, name, parentid) values (12, 1, 'gender', 0)
insert fields (id, type, name, parentid) values (13, 1, 'male', 12)
insert fields (id, type, name, parentid) values (14, 1, 'fe male', 12)
insert fields (id, type, name, parentid) values (15, 1, 'maritalstatus', 0)
insert fields (id, type, name, parentid) values (16, 1, 'married', 15)
insert fields (id, type, name, parentid) values (17, 1, 'unmarried', 15)
insert fields (id, type, name, parentid) values (18, 1, 'divorced', 15)

create table datafields(
    dataid int not null,
    fieldid int not null)

insert datafields (dataid, fieldid) values (1, 2)
insert datafields (dataid, fieldid) values (1, 10)
insert datafields (dataid, fieldid) values (1, 13)
insert datafields (dataid, fieldid) values (1, 16)
insert datafields (dataid, fieldid) values (2, 5)
insert datafields (dataid, fieldid) values (2, 11)
insert datafields (dataid, fieldid) values (2, 14)
insert datafields (dataid, fieldid) values (2, 17)


create table indicatorfields(
indicatorid int not null,
fieldid int not null)

insert indicatorfields (indicatorid, fieldid) values (1, 2)
insert indicatorfields (indicatorid, fieldid) values (1, 5)
insert indicatorfields (indicatorid, fieldid) values (1, 6)
insert indicatorfields (indicatorid, fieldid) values (1, 7)
insert indicatorfields (indicatorid, fieldid) values (1, 8)
insert indicatorfields (indicatorid, fieldid) values (1, 10)
insert indicatorfields (indicatorid, fieldid) values (1, 11)
insert indicatorfields (indicatorid, fieldid) values (1, 13)
insert indicatorfields (indicatorid, fieldid) values (1, 14)
insert indicatorfields (indicatorid, fieldid) values (1, 16)
insert indicatorfields (indicatorid, fieldid) values (1, 17)
insert indicatorfields (indicatorid, fieldid) values (1, 18)

create table indicatordata(
dataid int not null,
value varchar(255) not null,
indicatorid int not null) 

insert indicatordata (dataid, value, indicatorid) values (1, '1015', 1)
insert indicatordata (dataid, value, indicatorid) values (2, '12', 1)
我得到了这样的输出

我正试图获得与此类似的数据

因为我正在尝试枢轴概念

引导我得到类似于这样的生成表

我尝试了这个,但没有得到预期的输出

DECLARE @query NVARCHAR(4000),@cols NVARCHAR(4000),@groupid varchar(50)

set @groupid='1'
SELECT  @cols = COALESCE(@cols + ',[' + name + ']','[' + name + ']')
FROM    Fields where parentid=0
--ORDER BY name

SET @query = N'SELECT id, '+@cols +'
FROM
(
select d.dataid as id,b.name,e.value FROm IndicatorFields a INNER JOIN fields b On a.fieldid=b.id INNER JOIN fields c ON c.id=b.parentid
INNER JOIN DataFields d  ON a.fieldid=d.fieldid INNER JOIN IndicatorData e ON e.id=d.dataid
and a.indicatorid='+@groupid+') p
PIVOT
(
MAX([value])
FOR name IN
( '+@cols +' )
) AS pvt
ORDER BY id;'

print @query
EXECUTE(@query)

请不要将查询作为图像发布。假设我正确地复制了您的查询,我认为这将为您提供使用
PIVOT所需的信息

CREATE table indicator(id int not null,name varchar(255) not null)
insert indicator (id, name) values (1, 'basic employee details')

create table fields(
id int  not null,  
type int,
name varchar(255) not null,
parentid int not null)

insert fields (id, type, name, parentid) values (1, 1, 'year', 0)
insert fields (id, type, name, parentid) values (2, 2, '2010', 1)
insert fields (id, type, name, parentid) values (5, 2, '2011', 1)
insert fields (id, type, name, parentid) values (6, 2, '2012', 1)
insert fields (id, type, name, parentid) values (7, 2, '2013', 1)
insert fields (id, type, name, parentid) values (8, 2, '2014', 1)
insert fields (id, type, name, parentid) values (9, 1, 'nationality', 0)
insert fields (id, type, name, parentid) values (10, 1, 'bahrani', 9)
insert fields (id, type, name, parentid) values (11, 1, 'non bahrani', 9)
insert fields (id, type, name, parentid) values (12, 1, 'gender', 0)
insert fields (id, type, name, parentid) values (13, 1, 'male', 12)
insert fields (id, type, name, parentid) values (14, 1, 'fe male', 12)
insert fields (id, type, name, parentid) values (15, 1, 'maritalstatus', 0)
insert fields (id, type, name, parentid) values (16, 1, 'married', 15)
insert fields (id, type, name, parentid) values (17, 1, 'unmarried', 15)
insert fields (id, type, name, parentid) values (18, 1, 'divorced', 15)

create table datafields(
    dataid int not null,
    fieldid int not null)

insert datafields (dataid, fieldid) values (1, 2)
insert datafields (dataid, fieldid) values (1, 10)
insert datafields (dataid, fieldid) values (1, 13)
insert datafields (dataid, fieldid) values (1, 16)
insert datafields (dataid, fieldid) values (2, 5)
insert datafields (dataid, fieldid) values (2, 11)
insert datafields (dataid, fieldid) values (2, 14)
insert datafields (dataid, fieldid) values (2, 17)


create table indicatorfields(
indicatorid int not null,
fieldid int not null)

insert indicatorfields (indicatorid, fieldid) values (1, 2)
insert indicatorfields (indicatorid, fieldid) values (1, 5)
insert indicatorfields (indicatorid, fieldid) values (1, 6)
insert indicatorfields (indicatorid, fieldid) values (1, 7)
insert indicatorfields (indicatorid, fieldid) values (1, 8)
insert indicatorfields (indicatorid, fieldid) values (1, 10)
insert indicatorfields (indicatorid, fieldid) values (1, 11)
insert indicatorfields (indicatorid, fieldid) values (1, 13)
insert indicatorfields (indicatorid, fieldid) values (1, 14)
insert indicatorfields (indicatorid, fieldid) values (1, 16)
insert indicatorfields (indicatorid, fieldid) values (1, 17)
insert indicatorfields (indicatorid, fieldid) values (1, 18)

create table indicatordata(
dataid int not null,
value varchar(255) not null,
indicatorid int not null) 

insert indicatordata (dataid, value, indicatorid) values (1, '1015', 1)
insert indicatordata (dataid, value, indicatorid) values (2, '12', 1)



DECLARE @query NVARCHAR(4000),@cols NVARCHAR(4000),@groupid varchar(50)

set @groupid='1'
SELECT  @cols = COALESCE(@cols + ',[' + name + ']','[' + name + ']')
FROM    Fields where parentid=0


DECLARE @sel NVARCHAR(4000);
SELECT  @sel = COALESCE(@sel + ',MAX([' + name + ']) '+name,',MAX([' + name + ']) '+name) FROM  Fields where parentid=0

SET @query = N'SELECT value, dataid' + @Sel +'
     FROM 
    (SELECT 
          d.dataid
          ,b.name Name1
          ,d.fieldid
          ,c.name Name2
          ,e.value
    FROM dbo.indicatorfields a
    JOIN dbo.fields b ON a.fieldid = b.id
    JOIN dbo.fields c ON b.parentid = c.id
    JOIN dbo.datafields d ON a.fieldid = d.fieldid
    JOIN dbo.indicatordata e ON e.dataid = d.dataid
    )SRC
    PIVOT 
    (MAX(Name1) FOR Name2 IN ('+@cols+') )PVT
    GROUP BY dataid, value'

print @query
EXECUTE(@query)
然后,您可以将其封装在一些动态sql中—这里有大量的示例—使用搜索

SELECT dataid
,MAX(value) Value
,MAX([Year]) Year
,MAX([Nationality]) Nationality
,MAX([Gender]) Gender
,MAX([MaritalStatus]) MaritalStatus
 FROM 
(SELECT 
      d.dataid
      ,b.name Name1
      ,d.fieldid
      ,c.name Name2
      ,e.value
FROM dbo.indicatorfields a
JOIN dbo.fields b ON a.fieldid = b.id
JOIN dbo.fields c ON b.parentid = c.id
JOIN dbo.datafields d ON a.fieldid = d.fieldid
JOIN dbo.indicatordata e ON e.dataid = d.dataid
)SRC
PIVOT 
(MAX(Name1) FOR Name2 IN ([Year],[Nationality],[Gender], [MaritalStatus]) )PVT
GROUP BY dataid

dataid  Value  Year  Nationality  Gender   MaritalStatus
------  ------ ----- ------------ ------   -------------
1       1015  2010   bahrani      male     married
2       12    2011   non bahrani  fe male  unmarried

Warning: Null value is eliminated by an aggregate or other SET operation.

(2 row(s) affected)
编辑:

基于您对上述
PIVOT

CREATE table indicator(id int not null,name varchar(255) not null)
insert indicator (id, name) values (1, 'basic employee details')

create table fields(
id int  not null,  
type int,
name varchar(255) not null,
parentid int not null)

insert fields (id, type, name, parentid) values (1, 1, 'year', 0)
insert fields (id, type, name, parentid) values (2, 2, '2010', 1)
insert fields (id, type, name, parentid) values (5, 2, '2011', 1)
insert fields (id, type, name, parentid) values (6, 2, '2012', 1)
insert fields (id, type, name, parentid) values (7, 2, '2013', 1)
insert fields (id, type, name, parentid) values (8, 2, '2014', 1)
insert fields (id, type, name, parentid) values (9, 1, 'nationality', 0)
insert fields (id, type, name, parentid) values (10, 1, 'bahrani', 9)
insert fields (id, type, name, parentid) values (11, 1, 'non bahrani', 9)
insert fields (id, type, name, parentid) values (12, 1, 'gender', 0)
insert fields (id, type, name, parentid) values (13, 1, 'male', 12)
insert fields (id, type, name, parentid) values (14, 1, 'fe male', 12)
insert fields (id, type, name, parentid) values (15, 1, 'maritalstatus', 0)
insert fields (id, type, name, parentid) values (16, 1, 'married', 15)
insert fields (id, type, name, parentid) values (17, 1, 'unmarried', 15)
insert fields (id, type, name, parentid) values (18, 1, 'divorced', 15)

create table datafields(
    dataid int not null,
    fieldid int not null)

insert datafields (dataid, fieldid) values (1, 2)
insert datafields (dataid, fieldid) values (1, 10)
insert datafields (dataid, fieldid) values (1, 13)
insert datafields (dataid, fieldid) values (1, 16)
insert datafields (dataid, fieldid) values (2, 5)
insert datafields (dataid, fieldid) values (2, 11)
insert datafields (dataid, fieldid) values (2, 14)
insert datafields (dataid, fieldid) values (2, 17)


create table indicatorfields(
indicatorid int not null,
fieldid int not null)

insert indicatorfields (indicatorid, fieldid) values (1, 2)
insert indicatorfields (indicatorid, fieldid) values (1, 5)
insert indicatorfields (indicatorid, fieldid) values (1, 6)
insert indicatorfields (indicatorid, fieldid) values (1, 7)
insert indicatorfields (indicatorid, fieldid) values (1, 8)
insert indicatorfields (indicatorid, fieldid) values (1, 10)
insert indicatorfields (indicatorid, fieldid) values (1, 11)
insert indicatorfields (indicatorid, fieldid) values (1, 13)
insert indicatorfields (indicatorid, fieldid) values (1, 14)
insert indicatorfields (indicatorid, fieldid) values (1, 16)
insert indicatorfields (indicatorid, fieldid) values (1, 17)
insert indicatorfields (indicatorid, fieldid) values (1, 18)

create table indicatordata(
dataid int not null,
value varchar(255) not null,
indicatorid int not null) 

insert indicatordata (dataid, value, indicatorid) values (1, '1015', 1)
insert indicatordata (dataid, value, indicatorid) values (2, '12', 1)



DECLARE @query NVARCHAR(4000),@cols NVARCHAR(4000),@groupid varchar(50)

set @groupid='1'
SELECT  @cols = COALESCE(@cols + ',[' + name + ']','[' + name + ']')
FROM    Fields where parentid=0


DECLARE @sel NVARCHAR(4000);
SELECT  @sel = COALESCE(@sel + ',MAX([' + name + ']) '+name,',MAX([' + name + ']) '+name) FROM  Fields where parentid=0

SET @query = N'SELECT value, dataid' + @Sel +'
     FROM 
    (SELECT 
          d.dataid
          ,b.name Name1
          ,d.fieldid
          ,c.name Name2
          ,e.value
    FROM dbo.indicatorfields a
    JOIN dbo.fields b ON a.fieldid = b.id
    JOIN dbo.fields c ON b.parentid = c.id
    JOIN dbo.datafields d ON a.fieldid = d.fieldid
    JOIN dbo.indicatordata e ON e.dataid = d.dataid
    )SRC
    PIVOT 
    (MAX(Name1) FOR Name2 IN ('+@cols+') )PVT
    GROUP BY dataid, value'

print @query
EXECUTE(@query)

感谢您提供的示例数据感谢您尝试的编辑-在下面的回答中添加了动态SQL。我不想在这里定义列。。为什么?因为一切都是动态的。。。“年份、国籍、性别、婚姻状况”都是动态的……这将不起作用……如果我以后再添加一个字段……查询未执行……“请检查一次并更新它”重新测试并重新粘贴完整的测试脚本,它对我有效。这里应该有足够的数据进行调试。“值”字段数据在哪里?查看我的帖子…我如何尝试获得输出。。。。您缺少值字段…数据ID正确。。。但我没有得到预期的产出。。。。检查此图像…我如何尝试获取输出“”