1

我使用左外连接在 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 列做同样的事情。

4

1 回答 1

6

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

一个用于测试的 SQLfiddle

于 2013-05-22T18:00:57.200 回答