【问题标题】:Combining different Columns from different tables into distinct table将不同表中的不同列组合成不同的表
【发布时间】:2018-02-15 23:55:08
【问题描述】:

我需要从 3 个表中组合 3 个不同的列,结果集应该是一个不同的表。

蓝色表格是我的问题,黄色表格是我的预期答案。我怎样才能得到预期的表?

我不希望第 1 列的名称重复。

任何帮助将不胜感激。

【问题讨论】:

  • 哪个 sql 版本以及到目前为止您尝试过什么?
  • 这里的大多数人想要格式化的文本,而不是图像。
  • 那3张表有数据吗?也向我们展示预期的结果!
  • @maSTAShuFu 我有 SQ: Server 2012,我尝试了 Union 和 Full Outer joins
  • @jarlh 我发布了预期结果的图片,但我自己都没有看到图片。我需要学习如何正确使用它。如果您看到我的预期结果的图片,请告诉我

标签: sql sql-server


【解决方案1】:

完全外部联接

这个问题并没有给我们太多的帮助,所以我几乎没有对数据做出任何假设。似乎没有“名称”表,这 3 个表中的任何一个似乎都不能代表完整的名称列表。所以,我要闭上眼睛,输入几个完整的外连接:

Select t1.name, t1.country, t2.food, t3.movie 
    from table1 t1
    full outer join table2 t2 on t1.name = t2.name
    full outer join table3 t3 on t3.name = t1.name

这将为您提供所有名称(不假设任何一个表都需要包含完整列表),每个表只列出一次(前提是它们还没有出现多次在任何一个表中)以及来自三个表中的任何一个的与该名称关联的任何数据。

更新
所以这里有一个更新(见下面的评论),它用“是”或“否”替换了国家、食物和电影的名称。

Select 
        t1.name, 
        case when t1.country is null then 'no' else 'yes' end as country,
        case when t2.food is null then 'no' else 'yes' end as food,
        case when t3.movie is null then 'no' else 'yes' end as movie
    from table1 t1
    full outer join table2 t2 on t1.name = t2.name
    full outer join table3 t3 on t3.name = t1.name

...并用通用 Column1、Column2 重写,以防出现问题:

Select 
        t1.Column1 as name, 
        case when t1.Column2 is null then 'no' else 'yes' end as country,
        case when t2.Column2 is null then 'no' else 'yes' end as food,
        case when t3.Column2 is null then 'no' else 'yes' end as movie
    from table1 t1
    full outer join table2 t2 on t1.Column1 = t2.Column1
    full outer join table3 t3 on t3.Column1 = t1.Column1

我希望这会有所帮助。

【讨论】:

  • 我认为我的问题并不清楚。所有 3 个表将有 1 列“名称”,其值可能相同或不同。就像 CAry 可以在所有 3 个表中,但 Liz 只能在 1 个表中。我想要的结果是第一列有不同的名称列表,另一列说是/否。如果卡里去过国家,那么如果不是,那就是。当我进行完全外部连接时,所有列都给了我名字。我希望名称在 1 列中,在其他列中是或否
  • @Lina - 我在这里为您提供了一个更新的解决方案。如果它对您有帮助,请不要忘记“接受”它作为答案。谢谢。
  • @Lina - 自从我发布这些更新后你看到了吗?
  • 我没看到。我会试一试,让你知道。非常感谢你花时间帮助我。如果您提供的解决方案比我如何接受它作为答案有效?我是这里的新用户
  • 我现在知道如何接受了。让我尝试解决方案
【解决方案2】:

所以我想出了我的问题的答案。

我使用联合函数得到了预期的结果。

基本上,我有 3 个具有相同列名(编号)的表。 例如 700 可能在表 1 和表 3 中,但不在表 2 中,701 可能只在表 1 中。

我使用了这个查询:

select Number, SUM(I) as Country, SUM(D) as Place, SUM(A) as City from 
(
SELECT distinct(number), CASE WHEN m.number IS NULL THEN 0 ELSE 1 END AS I,0 AS D, 0 AS A
FROM dbo.country M(NOLOCK) 
Union
SELECT distinct(number),0 as I,CASE WHEN D IS NULL THEN 0 ELSE 1 END AS D, 0 AS A
FROM dbo.Food F(NOLOCK) 

【讨论】:

  • Distinct 是SELECT DISTINCT 的一部分,适用于整个选定行。跳过那些多余的括号,改用SELECT DISTINCT number, CASE WHEN ...。无论如何,UNION 删除了这里的所有重复项,因此您可以跳过 DISTINCT 并简单地执行 SELECT。
猜你喜欢
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多