【问题标题】:Join two tables and concatenate same column names in same statement连接两个表并在同一语句中连接相同的列名
【发布时间】:2019-06-22 03:46:41
【问题描述】:

我有一个很大的原始数据表。它很长,我正在尝试对其进行转置。我正在加入其中的两个选择语句。因此,我得到多个具有相同名称的列。这是一个完整的外部连接,我希望将两个同名的单独列作为一列。由于它是一个外连接,我不想只为它选择一个表列,比如 select t1.c1

谢谢!

SELECT *
  FROM (SELECT * FROM [LabData].[dbo].[FermHourlyDCSData] where Attribute='Urea') P
  full outer JOIN 
(SELECT * FROM [LabData].[dbo].[FermHourlyDCSData] where Attribute='Water to Mash Total Water') FPD ON 
P.[TimeStamp] = FPD.[TimeStamp] 
and P.Site = FPD.Site
and P.Element = FPD.Element

实际:

Site Attribute Timestamp Value Site Attribute Timestamp Value
AD   Urea      1/1/2019  127   Null Null      Null      Null
Null Null      Null      Null  AD   Water     1/1/2019  7.5

预期/期望:

Site Attribute Timestamp Value Value
AD   Urea      1/1/2019  127  Null
AD   Water     1/1/2019  Null 7.5

【问题讨论】:

  • 您是否看过ISNULL/COALESCE 并通过不使用* 来限制SELECT 中的列?如果没有,您尝试过什么来获得您所追求的结果集,为什么它不起作用/提供您所追求的结果?
  • 那么像 Select isnull(t1.c1,t2.c1) 这样的东西?想知道这是否有效?我试试看。
  • 表之间的 UNION ALL 会比连接表解决问题吗?
  • union all 的问题是我还想为每个为 value 列选择的列创建一个新列。即使我使用不同的名称为每个选择中的列起别名,它也不起作用。只有当每个表中的所有列都具有相同的名称时,我才会精简 union 和 union all。

标签: sql sql-server


【解决方案1】:

试试这个,它不是很漂亮,但它确实有效:

SELECT 
[Site] = ISNULL(P.[Site], FPD.[Site]),  
[Attribute] = ISNULL(P.[Attribute], FPD.[Attribute]),   
[Timestamp] =   ISNULL(P.[Timestamp], FPD.[Timestamp]), 
[Value] =   ISNULL(P.[Value], FPD.[Value]), 
[Element] =ISNULL(P.[Element], FPD.[Element])
FROM (SELECT * FROM [dbo].[FermHourlyDCSData] where Attribute='Urea') P
full outer JOIN 
(SELECT * FROM [dbo].[FermHourlyDCSData] where Attribute='Water to Mash Total Water') FPD ON 
P.[TimeStamp] = FPD.[TimeStamp] 
and P.Site = FPD.Site
and P.Element = FPD.Element

【讨论】:

  • 谢谢大家,这些都是很好的回应。我可能需要做一些嵌套的 isnulls,因为我实际上想要做的不仅仅是 2 个表之间的连接,而且 isnull 只接受 2 个参数。还有比这更有效的方法吗?
  • 您可能会使用 CASE WHEN ELSE
【解决方案2】:

ISNULL 是你应该使用的

ISNULL(p.Site,fpd.Site) as [Site]

【讨论】:

  • 我不能评论你上面的问题“谢谢大家,这些都是很好的回答。我可能需要做一些嵌套的 isnulls 虽然我实际上想要做的不仅仅是两个之间的连接表和 isnull 只接受 2 个参数。你能想到比这更有效的方法吗? ...
  • 签出 coalesce :) 类似于 isnull 但不止两个项目
【解决方案3】:

也许我遗漏了一些东西,但您似乎想要一个更简单的查询:

select Site, Attribute, Timestamp,
       (case when Attribute = 'Urea' then Value end) as value_u,
       (case when Attribute = 'Water to Mash Total Water' then Value end) as value_2
from [LabData].[dbo].[FermHourlyDCSData]
where Attribute  in ('Urea', 'Water to Mash Total Water')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多