如何将来自不同列的数据重新合并为一个,使用 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
我正在尝试为地质数据库编写查询,其中一些变更数据已记录到 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