加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何将行中的数据组合到列中

发布时间:2020-12-15 22:32:10 所属栏目:百科 来源:网络整理
导读:我有这样的结构.试图创建动态表 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
我有这样的结构.试图创建动态表

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,parentid) values (2,2,'2010',1)
insert fields (id,parentid) values (5,'2011',parentid) values (6,'2012',parentid) values (7,'2013',parentid) values (8,'2014',parentid) values (9,'nationality',parentid) values (10,'bahrani',9)
insert fields (id,parentid) values (11,'non bahrani',parentid) values (12,'gender',parentid) values (13,'male',12)
insert fields (id,parentid) values (14,'fe male',parentid) values (15,'maritalstatus',parentid) values (16,'married',15)
insert fields (id,parentid) values (17,'unmarried',parentid) values (18,'divorced',15)

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

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


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

insert indicatorfields (indicatorid,2)
insert indicatorfields (indicatorid,5)
insert indicatorfields (indicatorid,6)
insert indicatorfields (indicatorid,7)
insert indicatorfields (indicatorid,8)
insert indicatorfields (indicatorid,10)
insert indicatorfields (indicatorid,11)
insert indicatorfields (indicatorid,13)
insert indicatorfields (indicatorid,14)
insert indicatorfields (indicatorid,16)
insert indicatorfields (indicatorid,17)
insert indicatorfields (indicatorid,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,indicatorid) values (2,'12',1)

我得到了这样的输出

enter image description here

我试图获得类似这样的数据

enter image description here

因为我正在尝试枢轴概念……

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

我试过这个,没有得到预期的输出

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所需的内容

然后你可以将它包装在一些动态的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的动态SQL

CREATE table indicator(id int not null,'basic employee details')

create table fields(
id int  not null,1)



DECLARE @query NVARCHAR(4000),'[' + 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,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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读