Sql 从两个表的并集中选择顶部值
试图从一个联盟中选出前五名国家,但似乎不起作用。 这是我的代码:Sql 从两个表的并集中选择顶部值,sql,sql-server,union,Sql,Sql Server,Union,试图从一个联盟中选出前五名国家,但似乎不起作用。 这是我的代码: SELECT TOP 5 country_number, country_name FROM ( SELECT country_number, country_name, COUNT(DISTINCT number) FROM ( SELECT tc.country_number, tc.country_name, tdc.number, count(*) as tot_cnt
SELECT TOP 5 country_number, country_name
FROM
(
SELECT country_number, country_name, COUNT(DISTINCT number)
FROM
(
SELECT tc.country_number, tc.country_name, tdc.number, count(*) as tot_cnt
FROM tblCountry tc
INNER JOIN tblDivingClub AS tdc ON tdc.country = tc.country_number
INNER JOIN tblWorks_for AS tw ON tw.club_number = tdc.number
INNER JOIN tblDiver AS td ON td.diver_number = tw.diver_number
WHERE tw.end_working_date IS NULL
GROUP BY tc.country_number, tc.country_name, tdc.number
HAVING count(*) > 1
) as der
GROUP BY country_number, country_name
UNION
SELECT country_number, country_name, COUNT(DISTINCT number)
FROM
(
SELECT tc.country_number, tc.country_name, tdc.number, count(*) as diveCount
FROM tblCountry tc
INNER JOIN tblDivingClub AS tdc ON tdc.country = tc.country_number
INNER JOIN tblDiving AS tdv ON tdv.diving_club = tdc.number
WHERE tdv.date_of_diving >= DATEADD(year,-1, GETDATE())
GROUP BY tc.country_number, tc.country_name, tdc.number
HAVING count(*) > 6
) as der2
GROUP BY country_number, country_name
)as combinedTable
它不会接受“combinedTable”或我在“as”之后放置的任何其他名称/命令。在您第一次查询联合时,您需要一个别名作为聚合计数。在联合的第一个查询中,所有列都必须具有名称。由于使用函数计算值,因此必须使用别名为其指定名称:
SELECT country_number, country_name, COUNT(DISTINCT number) as countNumber
难道你不喜欢SQL的结构让它暗示你的代码的问题在代码文件的另一端吗?:) 您可以尝试为指定列名
COUNT(DISTINCT number)
甚至从两个选项中删除此列。您可以简化查询,但未经测试:
SELECT TOP 5 country_number, country_name
FROM
(
SELECT tc.country_number, tc.country_name, tdc.number, count(*) as tot_cnt
FROM tblCountry tc
JOIN tblDivingClub AS tdc ON tdc.country = tc.country_number
JOIN tblWorks_for AS tw ON tw.club_number = tdc.number
JOIN tblDiver AS td ON td.diver_number = tw.diver_number
WHERE tw.end_working_date IS NULL
OR tdv.date_of_diving >= DATEADD(year,-1, GETDATE())
GROUP BY tc.country_number, tc.country_name, tdc.number
HAVING count(*) > CASE WHEN tw.end_working_date IS NULL THEN 1 ELSE 6 END
) as T
我想知道这个违反直觉的错误是否与在表别名之后指定列别名有关?因为我相信理论上你可以做到这一点:
…)可组合(国家编号、国家名称、数字计数)