2016-06-13 119 views
4

我有這樣的結構。試圖創建動態表如何結合數據從行到列

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) 

我喜歡這個

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, '[email protected] +' 
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='[email protected]+') p 
PIVOT 
(
MAX([value]) 
FOR name IN 
('[email protected] +') 
) AS pvt 
ORDER BY id;' 

print @query 
EXECUTE(@query) 
+0

感謝樣本數據 – TheGameiswar

+0

感謝你已經試過什麼編輯與SQL你 - 添加動態SQL到我下面的答案。 –

回答

1

請不要發佈查詢爲圖像。假設我正確地複製了你的查詢,我想這給你你正在尋找什麼使用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

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 ('[email protected]+'))PVT 
    GROUP BY dataid, value' 

print @query 
EXECUTE(@query) 
+0

我不想在這裏定義列..爲什麼因爲所有動態...「年,國籍,性別,MaritalStatus」都是動態的....這不會工作..如果我將來再增加一個領域。 。 –

+0

http://stackoverflow.com/search?q=dynamic+pivot –

+0

查詢未執行...「請檢查一次並更新它」 –