【问题标题】:SQl left outer join to fill nullsql左外连接填充null
【发布时间】:2013-05-17 21:05:48
【问题描述】:

我使用左外连接在 SQL 中连接了两个表(见下文)。

是否可以用其他数据填充空单元格?

sqlfiddle

(来自小提琴)

CREATE TABLE Data1
    (cost_type nvarchar(10), contract nvarchar(10))
;

INSERT INTO Data1
    (cost_type, contract)
VALUES
    ('LABR', 'contract1'),
    ('EQP', ''),
    ('RST', 'contract1')
;

CREATE TABLE data2
    (cost_type nvarchar(10), contract nvarchar(10), Name nvarchar(max))
;

INSERT INTO data2
    (cost_type,contract,Name)
VALUES
    ('LABR','contract1','John'),
    ('MAT','contract1','John'),
    ('EQP','','')
;

当前正在运行的查询:

select * from data1 dt1 
left outer join data2 dt2 on dt1.cost_type=dt2.cost_type

我需要的结果如下:

COST_TYPE  CONTRACT  NAME  
LABR, contract1, John  
EQP, contract1, John  
RST, contract1, John

此结果基于查找 CONTRACT 列的最常用值并将所有空值替换为该值。我需要为 NAME 列做同样的事情。

【问题讨论】:

  • 有哪些数据?您的预期结果是什么?
  • 您需要再次加入表格,并按上一行加入
  • 你们不应该对新用户提出的任何问题投反对票。这样一来,您就会让新用户望而却步。
  • 最初我也想过投反对票,但在看到他的小提琴后,我印象深刻,他的问题是可以理解的。
  • @rockwell 由于您没有按任何顺序排序,因此行的顺序是随机的。如果 EQP 恰好位居榜首,你想要什么价值?从另一个随机行?

标签: sql sql-server join


【解决方案1】:

编辑:当您在上面的 cmets 中明确表示您希望使用最常用的合同/名称填充值时,查询不会太复杂而无法编写;用于查找每个最常用合约/名称的 CTE,以及将空值替换为 CTE 值的查询;

WITH most_used_contract AS (
  SELECT TOP 1 contract FROM Data1
  WHERE contract IS NOT NULL
  GROUP BY contract
  ORDER BY COUNT(*) DESC
), most_used_name AS (
  SELECT TOP 1 name FROM Data2
  WHERE name IS NOT NULL
  GROUP BY name
  ORDER BY COUNT(*) DESC
)
SELECT data1.cost_type, 
       CASE WHEN data1.contract IS NULL OR data1.contract = ''
            THEN muc.contract
            ELSE data1.contract END contract, 
       CASE WHEN data2.name IS NULL OR data2.name = ''
            THEN mun.name
            ELSE data2.name END name
FROM data1  
LEFT JOIN data2 ON data1.cost_type=data2.cost_type
LEFT JOIN most_used_contract muc ON 1=1
LEFT JOIN most_used_name mun ON 1=1

An SQLfiddle to test with.

【讨论】:

  • +1 用于为尚未明确定义的问题提供非常具体的答案。
  • @JoachimIsaksson 当您对值进行硬编码时,这似乎很好,但是如果在 Contract 列中有 Contract2,那么在 john 的情况下,它不会对所有记录一直重复 Contract2
  • @rockwell 在被问及如果 EQP 是第一行时在列中放置什么时引用您的话; “我只想在合同列中包含合同 1,在名称列中包含 John”。那显然不是你真正的意思。如果 EQP 排在第一行,是什么值?
  • @JoachimIsaksson 如果 EQP 在第一行,那么合同列将包含合同 1 和名称为 John
猜你喜欢
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多