如何将来自不同列的数据重新合并为一个,使用 Union 或 Coalesce 查询地质数据库

How can I reogransie data from different columns into one, Using Union or Coalesce query for geological database

我正在尝试为地质数据库编写查询,其中一些变更数据已记录到 table,tblDHAlteration。

使用 SQL Server 2012。

我想将 table 中的数据重新组织为查询或视图,以便将各种更改代码(例如 SER、SI、BIOT 和 GRAPH)放入各自的列中如附图所示。

我试过创建多个联合查询然后合并数据。我最终创建了视图,这很有效,但是我希望避免创建多个视图来合并。有没有 easier/more 有效的方法来写这些?

感谢您的帮助。 干杯

查看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)

合并查询:

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

试试这个:

;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