逻辑上合并4列相同的信息

时间:2013-02-14 23:24:17

标签: sql tsql

我在我们的环境中给出特定机器名称的“用户名”字段查询3个不同的数据库(总共4个字段):SCCM,McAfee EPO和ActiveDirectory。

四列是SCCM_TOP,SCCM_LAST,EPO,AD

我看到的一些元组如下:

JOE, JOE, ADMINISTRATOR, JOE

or
JOE, SARAH, JOE, JOE

or
NULL, NULL, JOE, JOE

or
NULL, NULL, JOE, SARAH

最后一个例子是最难编码的。

我正在写一个CASE语句,以帮助合并信息以一种附加方式给出一个 “最佳猜测”的最后一栏。目前,我正在根据另一列来衡量最有效的用户名,该列是每个数据库的“记录年龄”。

CASE 
 WHEN ePO_Age <= CT_AGE AND NOT ePO_UN IS NULL THEN ePO_UN 
 WHEN NOT (SCCM_AGE) IS NULL AND NOT (SCCM_LAST_UN) IS NULL THEN SCCM_LAST_UN
 WHEN NOT (SCCM_AGE) IS NULL AND NOT (SCCM_TOP_UN) IS NULL THEN SCCM_TOP_UN 
 WHEN NOT (AD_UN) IS NULL THEN AD_UN 
 ELSE NULL 
 END                  AS BestName,

但必须有更好的方法将这些记录合二为一。我的下一步是权衡“平均年龄”,然后从那里选择用户名,丢弃“管理员”。

有任何想法或伎俩吗?

2 个答案:

答案 0 :(得分:1)

你可以从COALESCE函数中获益,获得第一个NON-NULL值并做类似的事情:

COALESCE(CASE WHEN ePO_Age<=CT_AGE THEN ePO_UN END,
         CASE WHEN SCCM_AGE IS NOT NULL THEN COALESCE(SCCM_LAST_UN, SCCM_TOP_UN) END,
         AD_UN) AS BestName

答案 1 :(得分:0)

如果您只想获取非空的最新UserName,请尝试使用UNION来合并每个表的结果。

SELECT TOP 1 qry.UserName
FROM(
  SELECT UserName, CreateDate
  FROM UserNames_1
  UNION ALL
  SELECT UserName, CreateDate
  FROM UserNames_2
  UNION ALL
  SELECT UserName, CreateDate
  FROM UserNames_3
 ) AS qry
WHERE qry.UserName IS NOT NULL
ORDER BY qry.CreateDate DESC

拥有SQL Fiddle