2013-10-19 47 views
1

我想合并三个不同列中的值命名ProcessFalseRedirect,ProcessTrueRedirect,GeneralRedirectToPP到命名为PPID单列合并不同列数据。SQL查询到一个

我使用的查询是这样的,

select ProcessFalseRedirect,ProcessTrueRedirect,GeneralRedirectToPP from IVR_PPMaster 

这给了我下面的结果,

enter image description here

我希望我的输出是这样,

PPID
---------
PP-01
PP-02
PP-03
PP-04
PP-04A
PP-04B
PP-05

等。

我想要一个查询,它将忽略空白行和空白单元格。

请帮忙。

+0

有你试过连接?外连接可能会为你做到这一点。 –

+0

@JibranKhan你能否为我提供外部连接查询。我没有尝试过。并且在一个表上是外连接。 –

+0

您要求以升序保留数据,而不是按升序排列 – SilentKiller

回答

4

UNION可以帮到你。

select ProcessFalseRedirect PPID from IVR_PPMaster 
union 
select ProcessTrueRedirect from IVR_PPMaster 
union 
select GeneralRedirectToPP from IVR_PPMaster 

要获得升序排列数据使用:

select PPID from 
(
    select ProcessFalseRedirect PPID from IVR_PPMaster 
    union 
    select ProcessTrueRedirect from IVR_PPMaster 
    union 
    select GeneralRedirectToPP from IVR_PPMaster 
) p 
order by PPID 

注意,有UNIONUNION ALL之间的差异。

+0

这工作。它将第一行作为null。所以我添加了一个where子句。再次感谢。 –

+0

当然,因为你的列中有'NULL'值。 –

1

试试这个:

(SELECT ProcessFalseRedirect PPID FROM IVR_PPMaster WHERE ProcessFalseRedirect IS NOT NULL 
UNION ALL 
SELECT ProcessTrueRedirect FROM IVR_PPMaster WHERE ProcessTrueRedirect IS NOT NULL 
UNION ALL 
SELECT GeneralRedirectToPP FROM IVR_PPMaster WHERE GeneralRedirectToPP IS NOT NULL) 
ORDER BY ProcessFalseRedirect 
+0

这将给出所有的值,而在'UNION'的情况下,它将只显示一个值,如果它们在一行中是多个相同的值 – Rohaan

1

请不要这样

SELECT ProcessFalseRedirect FROM IVR_PPMaster where ProcessFalseRedirect<>'' 
UNION 
SELECT ProcessTrueRedirect from IVR_PPMaster where ProcessTrueRedirect<>'' 
UNION 
SELECT GeneralRedirectionTopp from IVR_PPMaster where GeneralRedirectionTopp<>'' 
1

对于SQL Server 2008+:

 
SELECT PPID 
FROM IVR_PPMaster 
CROSS APPLY (VALUES (ProcessFalseRedirect), 
        (ProcessTrueRedirect), 
        (GeneralRedirectToPP)) AS Lines(PPID) 
ORDER BY PPID 

解决方案的说明可以在这里找到:Table Value Constructors in SQL Server 2008