在单独的列中获取相同的表数据

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;

以上是关于在单独的列中获取相同的表数据的主要内容,如果未能解决你的问题,请参考以下文章

在两个单独的列中折叠具有连续范围的行

从包含来自单独列的数据的列中选择数据

如何从存储过程的表中的列中获取输出参数

将 Spark Dataframe 中的多个列发送到外部 API 并将结果存储在单独的列中

在 MySQL 中的表的多个列中查找连接的字符串

在 SQL 中,我可以在另一列中获取与它们没有关联的特定值的列中的值吗?