2017-06-05 6 views
-2

私はこのような大量のデータを持っています、ここで私は、サンプルデータのみ、だから、ケース与えてくれたとき、これに適していない句、 どのように以下のシナリオを解決するには、SQLサーバーを使用して?

DECLARE @T TABLE (EID INT, VALUE VARCHAR(50),CATEGORY VARCHAR(50),CATEGORY1 VARCHAR(50)) 

INSERT INTO @T 
SELECT 1,'JHON','NAME',NULL 
UNION 
SELECT 2,'MARY','NAME',NULL 
UNION 
SELECT 1,'IT','DEPT',NULL 
UNION 
SELECT 1,'85204-00065',NULL,'PHONE' 
UNION 
SELECT 1,'MALE',NULL,'GENDER' 
UNION 
SELECT 2,'85285-00525',NULL,'PHONE' 
UNION 
SELECT 2,'FEMALE',NULL,'GENDER' 
UNION 
SELECT 2,'BPO','DEPT',NULL 

SELECT * FROM @T 

予想される出力:

EId Name Dept Gender Phone 
1 Jhon IT  Male 85204-00065 
2 Mary Bpo  Female 85285-00525 

いずれかがより良い提供このシナリオのソリューション(あなたがこの質問を明確にする必要がない場合)CATEGORYとカテゴリ1は、相互に排他的であることを仮定し

+1

私は行の間に何らかの関係を見ることができない... – Prisoner

+2

は[EAV](HTTPSのいくつかの変種のように見える:// EN。 wikipedia.org/wiki/Entity-attribute-value_model)。一般的には、専門家以外のシナリオに戸惑う。 –

答えて

1

あなたが使用できます。

SELECT * 
FROM (
    SELECT x.EID, x.VALUE, ISNULL(x.CATEGORY, x.CATEGORY1) AS NEW_CATEGORY 
    FROM @T AS x 
    WHERE x.CATEGORY IN ('NAME', 'DEPT', 'GENDER') 
    OR x.CATEGORY1 IN ('NAME', 'DEPT', 'GENDER') 
) y 
PIVOT(MAX(y.VALUE) FOR y.NEW_CATEGORY IN ([NAME], [DEPT], [GENDER])) AS z 

注:この設計は(少なくとも言うために)奇妙です。 CATEGORYとCATEGORY1の2つの列には理由がありません。

+0

ありがとうBogdan、私はカテゴリとカテゴリ1のような列がたくさんあるので、上記のソリューションは私のシナリオには適していません –

+0

CATEGORY1000までCATEGORY2、CATEGORY3などもありますか? –

+0

まったく... like –

0

あなたはピボットを行うことができますが、以下のように合体し、動的なクエリ:

declare @cols1 varchar(max) 
declare @cols2 varchar(max) 
declare @query nvarchar(max) 

Select @cols1 = stuff((select Distinct ','+QuoteName(Coalesce(Category,Category1)) from YourEmpData for xml path('')),1,1,'') 
Select @Cols2 = 'Coalesce(' +stuff((Select ','+ QUOTENAME(Column_Name) from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'YourEmpData' and COLUMN_NAME not in ('EID', 'VALUE') for xml path('')),1,1,'') + ')' 

Select @query = ' Select * from (
     Select EID, [Value], ' + @cols2 + ' as Categories FROM YourEmpData) a 
     pivot (max([Value]) for [Categories] in (' + @cols1 + ')) p ' 

select @query --uncomment and execute if your query generated correct 
--exec sp_executesql @query 
関連する問題