Нужна помощь при объединении результатов из 3 столбцов в 1 (SQL Server 2012) - PullRequest
0 голосов
/ 08 апреля 2019

Я довольно плохо знаком с SQL и не могу понять, как объединить 3 столбца в 1, чтобы упростить создаваемый отчет. Столбцы используют операторы CASE. Основываясь на моих исследованиях, я считаю, что мне нужно использовать UNION или UNION ALL, но все, что я пробовал, не сработало.

Вот код. Я опустил несколько столбцов и просто оставил эти 3 столбца для краткости.

SELECT
    CASE
        WHEN r.scode IS NULL THEN ''
        ELSE r.scode
    END 'Column 1',
    CASE 
        WHEN (SELECT DISTINCT u.scode
            FROM Unit
            WHERE c.itype = 4) IS NULL THEN ''
        ELSE u.scode
    END 'Column 2',
    CASE 
        WHEN (SELECT DISTINCT f.scode
            FROM UnitType
            WHERE c.itype = 10) IS NULL THEN ''
        ELSE f.scode
    END 'Column 3'
FROM CapsConfig c
INNER JOIN CapsXref x
    ON c.hmy = x.hcapsconfig
INNER JOIN Prop p
    ON c.hprop = p.hmy
LEFT OUTER JOIN ChgTyp t
    ON x.hchgcode = t.hmy
LEFT OUTER JOIN Tenant r
    ON c.hpointer = r.hmyperson
LEFT OUTER JOIN Unit u
    ON c.hpointer = u.hmy
LEFT OUTER JOIN UnitType f
    ON c.hpointer = f.hmy;

Токовый выход:

Column 1    Column 2    Column 3

                        0021117U
                        0021117U
                        0021117U
                        0032117U
                        0032117U
                        0032117U
            16NL1
            16NL1
            16NL1
            102FL1
            102FL1
            102FL1
t0002177
t0002178
t0002178
t0002178

Я бы хотел, чтобы это было:

Combined

0021117U
0021117U
0021117U
0032117U
0032117U
0032117U
16NL1
16NL1
16NL1
102FL1
102FL1
102FL1
t0002177
t0002178
t0002178
t0002178

Любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 17 апреля 2019

Я делал это сложнее, чем нужно.Я получил результаты, которые я хотел с одним подзапросом:

(SELECT
        CASE
            WHEN c.itype = 1 THEN r.scode
            WHEN c.itype = 4 THEN u.scode
            WHEN c.itype = 10 THEN f.scode
            ELSE 'N/A'
        END)
0 голосов
/ 26 апреля 2019

Вы можете попробовать это:

declare @t table (col1 varchar(50),col2 varchar(50),col3 varchar(50))

insert into @t values ('','','0021117U')
insert into @t values ('','16NL1','')
insert into @t values ('t0002177','','')


select col1 from @t
where col1 <> ''

union all

select col2 from @t
where col2 <> ''

union all

select col3 from @t
where col3 <> ''
order by 1
0 голосов
/ 08 апреля 2019

Кажется, вы хотите

SELECT
    CASE
        WHEN r.scode IS NULL THEN ''
        ELSE r.scode
    END 'Column 1',
    CASE 
        WHEN ( u.scode IS NULL AND c.itype = 4)  THEN ''
        ELSE u.scode
    END 'Column 2',
    CASE 
        WHEN ( f.scode IS NULL AND c.itype = 10)  THEN ''
        ELSE f.scode
    END 'Column 3'
FROM CapsConfig c
INNER JOIN CapsXref x
    ON c.hmy = x.hcapsconfig
INNER JOIN Prop p
    ON c.hprop = p.hmy
LEFT OUTER JOIN ChgTyp t
    ON x.hchgcode = t.hmy
LEFT OUTER JOIN Tenant r
    ON c.hpointer = r.hmyperson
LEFT OUTER JOIN Unit u
    ON c.hpointer = u.hmy
LEFT OUTER JOIN UnitType f
    ON c.hpointer = f.hmy;
...