SQL语句将两行合并为一行

时间:2017-09-18 06:52:49

标签: sql sql-server row

在我的sql语句(SQL Server 2016)的结果中,我想将两行中具有相同值的两行(“study_id”和“study_start”)组合成一行,并保持行具有最高值。第三个单元格(“Id”)。如果具有最高Id的行中的任何列(即“App_id”或“Date_arrival”)为NULL,则它应采用具有最低“Id”的行中的值。

我得到以下结果:

Id      study_id    study_start  Code   Expl       Desc      Startmonth App_id  Date_arrival    Efter_op    Date_begin
167262    878899            954   4.1   udd.ord    Afbrudt   feb        86666   21-06-2012      N           17-08-2012
180537    878899            954     1   Afsluttet  Afsluttet feb        NULL    NULL            NULL        NULL

我想得到这个结果:

Id      study_id    study_start  Code   Expl       Desc      Startmonth App_id  Date_arrival    Efter_op    Date_begin
180537  878899       954            1   Afsluttet  Afsluttet feb        86666   21-06-2012      N           17-08-2012

我的陈述如下:

SELECT dbo.PopulationStam_V.ELEV_ID AS id,
dbo.PopulationStam_V.PERS_ID AS study_id,
dbo.STUDIESTARTER.STUDST_ID AS study_start, 
dbo.Optagelse_Studiestatus.AFGANGSARSAG AS Code, 
dbo.Optagelse_Studiestatus.KORT_BETEGNELSE AS Expl, 
ISNULL((CAST(dbo.Optagelse_Studiestatus.Studiestatus AS varchar(20))), 'Indskrevet') AS 'Desc',
dbo.STUDIESTARTER.OPTAG_START_MANED AS Startmonth,
dbo.ANSOGNINGER.ANSOG_ID as App_id,
dbo.ANSOGNINGER.ANKOMSTDATO AS Data_arrival',
dbo.ANSOGNINGER.EFTEROPTAG AS Efter_op,
dbo.ANSOGNINGER.STATUSDATO AS Date_begin
FROM dbo.INSTITUTIONER 
INNER JOIN dbo.PopulationStam_V 
ON dbo.INSTITUTIONER.INST_ID = dbo.PopulationStam_V.SEMI_ID 
LEFT JOIN dbo.ANSOGNINGER 
ON dbo.PopulationStam_V.ELEV_ID = dbo.ANSOGNINGER.ELEV_ID 
INNER JOIN dbo.STUDIESTARTER 
ON dbo.PopulationStam_V.STUDST_ID_OPRINDELIG = dbo.STUDIESTARTER.STUDST_ID 
INNER JOIN dbo.UDD_NAVNE_T 
ON dbo.PopulationStam_V.UDDA_ID = dbo.UDD_NAVNE_T.UDD_ID 
INNER JOIN dbo.UDDANNELSER 
ON dbo.UDD_NAVNE_T.UDD_ID = dbo.UDDANNELSER.UDDA_ID 
LEFT OUTER JOIN dbo.PERSONER 
ON dbo.PopulationStam_V.PERS_ID = dbo.PERSONER.PERS_ID 
LEFT OUTER JOIN dbo.POSTNR 
ON dbo.PERSONER.PONR_ID = dbo.POSTNR.PONR_ID 
LEFT OUTER JOIN dbo.KønAlleElevID_V 
ON dbo.PopulationStam_V.ELEV_ID = dbo.KønAlleElevID_V.ELEV_ID 
LEFT OUTER JOIN dbo.Optagelse_Studiestatus 
ON dbo.PopulationStam_V.AFAR_ID = dbo.Optagelse_Studiestatus.AFAR_ID 
LEFT OUTER JOIN dbo.frafaldsmodel_adgangsgrundlag 
ON dbo.frafaldsmodel_adgangsgrundlag.ELEV_ID = dbo.PopulationStam_V.ELEV_ID 
LEFT OUTER JOIN dbo.Optagelse_prioriteterUFM 
ON dbo.Optagelse_prioriteterUFM.cpr = dbo.PopulationStam_V.CPR_NR 
AND dbo.Optagelse_prioriteterUFM.Aar = dbo.frafaldsmodel_adgangsgrundlag.optagelsesaar 
LEFT OUTER JOIN dbo.frafaldsmodel_stoettetabel_uddannelser AS fsu 
ON fsu.id_uddannelse = dbo.UDDANNELSER.UDDA_ID 
AND fsu.id_inst = dbo.INSTITUTIONER.INST_ID 
AND fsu.uddannelse_aar = dbo.frafaldsmodel_adgangsgrundlag.optagelsesaar
WHERE dbo.STUDIESTARTER.STUDIESTARTSDATO > '2012-03-01 00:00:00.000' 
AND (dbo.Optagelse_Studiestatus.AFGANGSARSAG IS NULL 
OR dbo.Optagelse_Studiestatus.AFGANGSARSAG NOT LIKE '2.7.4') 
AND (dbo.PopulationStam_V.INDSKRIVNINGSFORM = '1100' 
OR dbo.PopulationStam_V.INDSKRIVNINGSFORM = '1700') 
GROUP BY dbo.PopulationStam_V.ELEV_ID,
dbo.PopulationStam_V.PERS_ID,
dbo.STUDIESTARTER.STUDST_ID,
dbo.Optagelse_Studiestatus.AFGANGSARSAG,
dbo.Optagelse_Studiestatus.KORT_BETEGNELSE,
dbo.STUDIESTARTER.OPTAG_START_MANED,
Studiestatus,
dbo.ANSOGNINGER.ANSOG_ID,
dbo.ANSOGNINGER.ANKOMSTDATO,
dbo.ANSOGNINGER.EFTEROPTAG,
dbo.ANSOGNINGER.STATUSDATO

我真的希望那里的人可以提供帮助。

1 个答案:

答案 0 :(得分:0)

很多方法,这都有效:

WITH subSource AS (
/* Your query here */
)
SELECT
  s1.id,
  /* all other columns work like this: 
     COALESCE(S1.column,s2.column)
     for example: */
  coalesce(s1.appid,s2.appid) as appid
FROM subSource s1
INNER JOIN subSource s2
ON s1.study_id =s2.study_id 
  and s1.study_start = s2.study_start 
  AND s1.id > s2.id
  /* I imagine some other clauses might be needed but maybe not */

其余的是复制粘贴