2017-11-18 4 views
2

変更データがテーブルに記録されている地質データベースのクエリtblDHAlterationを作成しようとしています。どのようにして異なる列のデータを1つに再統一することができますか?地質データベースのUnionまたはCoalesceクエリの使用

例えばSER、SI、BIOTグラフのような種々の変更コードが、配置されているように、私は、クエリとして、またはビューのいずれかのテーブル内のデータを再編成するSQL Server 2012

を使用添付の画像に示されているようにそれぞれの列に表示されます。

私は複数のユニオンクエリを作成してから、データを結合しようとしました。私はビューを作成して終了しましたが、これは機能しますが、私は、複数のビューを作成して融合を避けることを望んでいました。これらを書くのがより簡単で効率的な方法はありますか?

ありがとうございました。 乾杯

ビューAA:

(SELECT DATASET, HOLE_ID, Depth_FROM, DEPTH_TO, Alt_SER, Alt_SI from 
(SELECT DATASET, HOLE_ID, Depth_FROM, DEPTH_TO, Alt_SER, NULL as 'Alt_SI' from 
(SELECT DATASET, HOLE_ID, Depth_FROM, DEPTH_TO, Alt1_Code as Alt_SER FROM tblDHAlteration where Alt1_Code = 'SER') A 
UNION ALL 
SELECT DATASET, HOLE_ID, Depth_FROM, DEPTH_TO, Alt_SER, NULL as 'Alt_SI' from 
(SELECT DATASET, HOLE_ID, Depth_FROM, DEPTH_TO, Alt2_Code as Alt_SER FROM tblDHAlteration where Alt2_Code = 'SER') B) AA) 

ビューBB:

(SELECT DATASET, HOLE_ID, Depth_FROM, DEPTH_TO, Alt_SER, Alt_SI from 
(SELECT DATASET, HOLE_ID, Depth_FROM, DEPTH_TO, NULL AS 'Alt_SER', Alt_SI from 
(SELECT DATASET, HOLE_ID, Depth_FROM, DEPTH_TO, Alt1_Code as Alt_SI FROM tblDHAlteration where Alt1_Code = 'SI') A 
UNION ALL 
SELECT DATASET, HOLE_ID, Depth_FROM, DEPTH_TO, NULL AS 'Alt_SER', Alt_SI from 
(SELECT DATASET, HOLE_ID, Depth_FROM, DEPTH_TO, Alt2_Code as Alt_SI 
FROM tblDHAlteration where Alt2_Code = 'SI') B) BB) 

COALESCEクエリ:

SELECT COALESCE (AA.DATASET, BB.DATASET) DATASET, COALESCE (AA.HOLE_ID, BB.HOLE_ID) HOLE_ID, COALESCE (AA.DEPTH_FROM,BB.DEPTH_FROM) DEPTH_FROM, 
COALESCE (AA.DEPTH_TO,BB.DEPTH_TO) DEPTH_TO, 
COALESCE(CAST(AA.Alt_SER as nvarchar(25)),CAST(BB.Alt_SER as nvarchar(25))) ALT_SER, 
COALESCE(CAST(AA.Alt_SI as nvarchar(25)),CAST(BB.Alt_SI as nvarchar(25))) Alt_SI, 
From AA full outer join BB 
on AA.Dataset = BB.DataSet and AA.Hole_ID = BB.Hole_ID AND AA.Depth_From = BB.Depth_From 
order by dataset, hole_ID, Depth_From 

enter image description here

答えて

0

はこれを試してみてください:

;with data as (
    select 
     DataSet, 
     Hole_ID, 
     Depth_From, 
     Depth_To, 
     Alt_Code = Alt1_Code 
    from tblDHAlteration 
    union all 
    select 
     DataSet, 
     Hole_ID, 
     Depth_From, 
     Depth_To, 
     Alt_Code = Alt2_Code 
    from tblDHAlteration 
) 
select 
    data.DataSet, 
    data.Hole_ID, 
    data.Depth_From, 
    data.Depth_To, 
    Alt_SER = max(pvt.Alt_SER), 
    Alt_Si = max(pvt.Alt_Si), 
    Alt_Biot = max(pvt.Alt_Biot), 
    Alt_Graph = max(pvt.Alt_Graph) 
from data 
cross apply (values 
    ('Ser', 'Ser', ' ', ' ', ' '), 
    ('Si', ' ', 'Si', ' ', ' '), 
    ('Biot', ' ', ' ', 'Biot', ' '), 
    ('Graph', ' ', ' ', ' ', 'Graph') 
) pvt(Alt_Code, Alt_SER, Alt_Si, Alt_Biot, Alt_Graph) 
where pvt.Alt_Code = data.Alt_Code 
group by 
    data.DataSet, 
    data.Hole_ID, 
    data.Depth_From, 
    data.Depth_To 
+1

ファンタスティックピーテル!どうもありがとう。私はちょうどtblDHAlterationといくつかの "、"クロスセクションを適用するために追加しなければならなかったとその実行は素晴らしい実行される! – Cleaver

関連する問題