TSQL返回所有匹配和不匹配的行

时间:2014-03-30 17:44:18

标签: sql sql-server tsql

这是我必须要合作的。

Table A
-------
UnitID   NamedValue   Value
Null     TestA        11
Null     TestB        30
1        TestA        20
1        TestB        15
2        TestA        18

如果尚未设置UnitID,表A包含所有已定义的值和默认值。 因此,UnitID 1应将TestA值提高20,将TestB提取为15。 UnitID 2应该提取TestA值18和默认值TestB值30

结果应如下所示:

UnitID   NamedValues   Value
1        TestA         20
1        TestB         15
2        TestA         18
2        TestB         30

我没有设计这个东西,但我必须使用它。 请帮助我提供所需结果的联接。我可以使用临时表来实现它,但希望能够进行简单的连接。

2 个答案:

答案 0 :(得分:1)

此查询查找UnitID和NamedValue的所有组合,并使用默认值填充所有缺失值。不是最美丽的查询,但似乎可以完成这项工作;

WITH cte AS (
  SELECT DISTINCT a.UnitID, b.NamedValue
  FROM Table_A a CROSS JOIN Table_A b
  WHERE a.UnitID IS NOT NULL
)
SELECT cte.UnitID, cte.NamedValue, COALESCE(c.Value, d.Value) Value
FROM cte
LEFT JOIN Table_A c ON cte.UnitID = c.UnitID AND cte.NamedValue = c.NamedValue
LEFT JOIN Table_A d ON d.UnitID IS NULL AND cte.NamedValue = d.NamedValue

An SQLfiddle to test with

答案 1 :(得分:0)

这应该这样做:

SELECT a.UnitID, v.NamedValues, COALESCE(v.Value, d.Value) As Value
FROM (Select 'TestA' As Nam UNION ALL Select 'TestB') v
LEFT OUTER JOIN 
     (Select UnitID, NamedValues, MAX(Value) As Value 
      From TableA 
      Group By UnitID, NamedValues
     ) a
    ON v.Nam = a.NamedValues
LEFT OUTER JOIN 
     (Select UnitID, NamedValues, MAX(Value) As Value 
      From TableA 
      Where UnitID IS NULL
      Group By UnitID, NamedValues
     ) d
    ON v.Nam = d.NamedValues