【问题标题】:How to combine data from rows to columns如何将数据从行合并到列
【发布时间】:2016-06-13 07:58:33
【问题描述】:

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

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)

【问题讨论】:

  • 感谢样本数据
  • 感谢您尝试编辑 - 在下面的答案中添加了动态 SQL。

标签: c# sql sql-server-2008


【解决方案1】:

请不要将查询发布为图片。假设我正确复制了您的查询,我认为这可以为您提供使用 PIVOT 的内容。

然后您可以将其包装在一些动态 sql 中 - SO 上有大量示例 - 使用搜索。

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,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)

【讨论】:

  • 我不想在这里定义列.. 为什么因为都是动态的...“年、国籍、性别、婚姻状况”都是动态的....这行不通..如果我以后再添加一个字段..
  • 查询未执行..."请检查一次并更新它"
  • 重新测试并重新粘贴完整的测试脚本,它对我有用。你应该有足够的空间来调试。
  • “值”字段数据在哪里?检查我的帖子....我是如何尝试获取输出的....您错过了值字段....
  • dataid 是正确的......但我没有得到预期的输出......检查这张图片......我如何尝试获得输出“i.stack.imgur.com/2SZZu.jpg
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多