SQl左外部联接以填充null

SQl左外部联接以填充null,sql,sql-server,join,Sql,Sql Server,Join,我使用左外部联接在SQL中联接了两个表,请参见下文 是否可以用其他数据填充空单元格 从小提琴 CREATE TABLE Data1 (cost_type nvarchar(10), contract nvarchar(10)) ; INSERT INTO Data1 (cost_type, contract) VALUES ('LABR', 'contract1'), ('EQP', ''), ('RST', 'contract1') ; CREATE

我使用左外部联接在SQL中联接了两个表,请参见下文

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

从小提琴

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

此结果基于查找合同列最常用的值并用该值替换所有空值。我需要对“名称”列执行相同的操作。

编辑:当您在上面的评论中明确表示希望用最常用的合同/名称填充值时,查询并不太复杂,无法编写;用于查找每个最常用合同/名称的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

.

编辑:当您在上面的评论中明确表示希望用最常用的合同/名称填充值时,查询并不太复杂,无法编写;用于查找每个最常用合同/名称的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


.

使用哪些数据?您的预期结果是什么?您需要再次加入该表,并按前一行加入。您的人不应该对新用户提出的任何问题投否决票。这样做会让新用户泄气。起初我还想投反对票,但看到他的小提琴后,我印象深刻,他的问题是可以理解的。@rockwell因为你没有按任何东西排序,所以行的顺序是随机的。如果EQP恰好位于顶部,您希望得到什么值?来自另一个随机行?使用哪些数据?您的预期结果是什么?您需要再次加入该表,并按前一行加入。您的人不应该对新用户提出的任何问题投否决票。这样做会让新用户泄气。起初我还想投反对票,但看到他的小提琴后,我印象深刻,他的问题是可以理解的。@rockwell因为你没有按任何东西排序,所以行的顺序是随机的。如果EQP恰好位于顶部,您希望得到什么值?来自另一个随机行?+1,用于为尚未定义好的问题提供非常具体的答案。@JoachimIsaksson当您硬编码了值时,这似乎很好,但如果合同栏中有合同2,则不会对所有记录重复合同2,以防john@rockwell当被问及如果EQP是第一行,在列中放置什么时,引用您的话;我只想把合同1放在合同栏,约翰放在名字栏。那显然不是你真正的意思。如果EQP出现在第一行,那么值是多少?@JoachimIsaksson如果EQP出现在第一行,那么合同列将有合同1,名称为John+1,用于为一个尚未定义好的问题提供非常具体的答案。@JoachimIsaksson如果您硬编码了值,这似乎很好,但如果合同栏中有合同2,则不会对所有记录重复合同2,以防john@rockwell当被问及如果EQP是第一行,在列中放置什么时,引用您的话;我只想把合同1放在合同栏,约翰放在名字栏。那显然不是你真正的意思。如果EQP出现在第一行,值是多少?@JoachimIsaksson如果EQP出现在第一行,则合同列将有合同1,名称为John