在单独的列中获取相同的表数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在单独的列中获取相同的表数据相关的知识,希望对你有一定的参考价值。
我有一个这种格式的SQL表
ColumnID Column1 Column2 Column3
-------------------------------------------
230 ABC 20 1
230 DEF 14.50 1
230 XYZ 10 1
230 DEF 09 0
230 ABC 30 0
230 MNO 16 0
230 OOP 07 1
我想基于Column3 = 1和Column3 = 0的ColumnID输出如下
output_Column1 output_Column2 output_Column3 output_Column4
--------------------------------------------------------------------------
ABC 20 ABC 30
DEF 14.50 DEF 09
OOP 07 MNO 16
XYZ 10 NULL NULL
使用自联接我得到了6条不正确的记录。 Column3值与column3 = 0的column1值匹配并不是必须的。
请帮忙!
答案
试试这个:
SELECT MAX(CASE WHEN Column3 = 1 THEN Column1 ELSE NULL END) output_Column1,
MAX(CASE WHEN Column3 = 1 THEN Column2 ELSE NULL END) output_Column2,
MAX(CASE WHEN Column3 = 0 THEN Column1 ELSE NULL END) output_Column3,
MAX(CASE WHEN Column3 = 0 THEN Column2 ELSE NULL END) output_Column4
FROM tablename
GROUP BY ColumnID, Column1;
另一答案
试试这个
SELECT t1.Column1 AS output_Column1,t1.Column2
AS output_Column2, t2.Column1 AS
output_Column3,t2.Column2 AS output_Column4 FROM mytable
as t1 LEFT OUTER JOIN mytable
as t2 ON t1.COLUMNID=t2.COLUMNID WHERE t1.COlumn3 =0 AND t1.Column3=3
或者
SELECT t1.Column1 AS output_Column1,t1.Column2
AS output_Column2, t2.Column1 AS
output_Column3,t2.Column2 AS output_Column4 FROM mytable
as t1 LEFT OUTER JOIN mytable
as t2 ON t1.COLUMNID=t2.COLUMNID WHERE EXISTS
(
SELECT ColumnID FROM mytable WHERE COLUMNID=t1.COlumnID and Column3=0 AND COlumn3=3
)
另一答案
好的,从您的评论中我收集到了Column1值
- 只存在一个Column3 = 0的记录,而没有Column3 = 1的记录
- 只存在一个Column3 = 1的记录,而没有Column3 = 0的记录
- 存在Column3 = 1的一条记录和Column3 = 0的一条记录
和
- 对于Column1值,Column3 = 0永远不会存在多条记录。
- 对于Column1值,Column3 = 1永远不会存在多条记录。
自联接表,一次为column3 = 0,一次为column3 = 1.使用完全外连接,以获取没有column3 = 0或1的条目的记录。
select
m1.column1 as output_column1,
m1.column2 as output_column2,
m0.column1 as output_column3,
m0.column2 as output_column4
from (select * from mytable where column3 = 0) m0
full outer join (select * mytable where column3 = 1) m1
on m0.column1 = m1.column1;
没有自联接,您可以实现相同的目标:
select
max(case when column3 = 1 then column1 end) as output_column1,
max(case when column3 = 1 then column2 end) as output_column2,
max(case when column3 = 0 then column1 end) as output_column3,
max(case when column3 = 0 then column2 end) as output_column4
from mytable
where column3 in (0,1)
group by column1;
另一答案
以下是对您的请求所做更改的单独答案,使其成为另一个问题。
SQL查询从关系数据库中选择相关数据。但是,在您的情况下,您选择不相关的数据。如果你将OOP与MNO结合并且单独留下XYZ或者将XYZ与MNO结合并且单独留下OOP并不重要。您加入记录虽然它们彼此无关。 (OOP和XYZ都与MNO无关。)
通常你会选择
output_Column1 output_Column2 output_Column3 output_Column4 ABC 20 ABC 30 DEF 14.50 DEF 09 MNO 16 OOP 07 XYZ 10
但你想要它
output_Column1 output_Column2 output_Column3 output_Column4 ABC 20 ABC 30 DEF 14.50 DEF 09 OOP 07 MNO 16 XYZ 10
以便保存行。您通常会在显示数据的应用程序中执行此操作,即使用Java,C#,php或其他任何内容来填充显示网格。
如果要通过加入不相关的记录在SQL中实现相同的目标,则必须创建关系。例如,将行号添加到所有column3 = 0个没有兄弟,其中column3 = 1的记录,并将行号添加到所有column3 = 1个没有兄弟,column3 = 0的记录。然后将第一个与第二个按行号相结合。
select
m1.column1 as output_column1,
m1.column2 as output_column2,
m0.column1 as output_column3,
m0.column2 as output_column4
from (select * from mytable where column3 = 0) m0
join (select * mytable where column3 = 1) m1 on m1.column1 = m0.column1
union all
select
m1.column1 as output_column1,
m1.column2 as output_column2,
m0.column1 as output_column3,
m0.column2 as output_column4
from
(
select
row_number() over (order by column1) as joinkey,
column1,
column2
from mytable
where column3 = 0
and not exists
(
select *
from mytable couple
where couple.column1 = mytable.column1
and couple.column3 = 1
)
) m0
full outer join
(
select
row_number() over (order by column1) as joinkey,
column1,
column2
from mytable
where column3 = 1
and not exists
(
select *
from mytable couple
where couple.column1 = mytable.column1
and couple.column3 = 0
)
) m1 on m1.joinkey = m0.joinkey;
以上是关于在单独的列中获取相同的表数据的主要内容,如果未能解决你的问题,请参考以下文章