我有两个查询从同一个模式中提取信息,我将它们连接在一起以创建一个表。但是,我需要其中一个结果列。在下面的示例中,我需要从结果中删除第二个“owneridname”列。
当前结果:
所有者名称 | 是的 | 所有者名称 | 不 |
---|---|---|---|
姓名1 | 230 | 姓名1 | 400 |
名字2 | 345 | 名字2 | 546 |
名字3 | 87 | 名字3 | 2345 |
应该:
所有者名称 | 是的 | 不 |
---|---|---|
姓名1 | 230 | 400 |
名字2 | 345 | 546 |
名字3 | 87 | 2345 |
SELECT *
FROM
(
SELECT owneridname, COUNT(owneridname) AS 'Yes' FROM incident
WHERE svb_contactname IS NOT NULL
AND sub_caseinitiatedfrom IN ('1', '2', '3', '4', '16', '17')
AND sub_status_case IN ('1','2','12')
GROUP BY owneridname
) as FirstSet
INNER JOIN
(
SELECT owneridname, COUNT(owneridname) AS 'No' FROM incident
WHERE svb_contactname IS NULL
AND sub_caseinitiatedfrom IN ('1', '2', '3', '4', '16', '17')
AND sub_status_case IN ('1','2','12')
GROUP BY owneridname
) as SecondSet
on FirstSet.owneridname = SecondSet.owneridname
ORDER BY FirstSet.Yes DESC;
当我将“owneridname”插入第一个 SELECT 语句时,我收到错误消息“Msg 209,Level 16,State 1,Line 1 Ambiguous column name 'owneridname'。” 不确定为什么它认为它是一个不明确的列名?
正如其他人所提到的,如果您有多个同名的列,则需要在列上使用表别名。无论如何,你真的应该总是添加表别名。
但是通过使用条件聚合,您的查询可以大大简化。
COUNT
将只计算非空值。如果你想要更复杂的条件,你可以做类似的事情COUNT(CASE WHEN yourConditionHere THEN 1 END)
问题在这里:
您在两个派生选择中具有相同的列名,因此如果您没有指定要从哪个派生选择中提取列,查询引擎就不清楚它应该为外部选择查询投影哪一列。
您需要将正确的列别名添加到外部选择列表,这与您掌握的将列别名添加到连接条件相同
on FirstSet.owneridname = SecondSet.owneridname
。由于
Yes
和No
是唯一的列名,别名被认为是可选的,但强烈建议使用。您需要使用派生表名称作为字段列表的一部分。选择 firstset.owneridname, firstset.yes, secondset.no