在http://www.dofactory.com/sql/sandbox我正在尝试针对其示例数据库提交我自己的SQL查询,以便在SQL上变得更好。我想要做的是从Customer中选择所有具有最少元组数的国家/地区。这是我的查询尝试:
SELECT a.Country
FROM [Customer] a, (SELECT COUNT(*) AS Tot
FROM [Customer]
GROUP BY Country) b
GROUP BY a.Country
HAVING COUNT(*) = MIN(b.Tot)
然而,该网站返回一个空表而不是正确的结果(爱尔兰,挪威,波兰)。通过按国家/地区分组并使用COUNT(*)
,然后查看所有COUNT(*)
值中COUNT(*)
值最小的国家/地区,可以轻松实现正确的结果。关于如何在不对表格数据做任何假设的情况下生成正确的结果,我想提供一些建议。
答案 0 :(得分:4)
我会使用SELECT TOP 1 WITH TIES
执行此操作:
SELECT TOP 1 WITH TIES c.Country
FROM Customer c
GROUP BY c.Country
ORDER BY COUNT(*) ASC;
两个注释:
FROM
子句中使用逗号。 始终使用正确的JOIN
语法。答案 1 :(得分:1)
再次向Gordon Linoff学习了新的(WITH TIES)......
这是我没有它的解决方案......
Select a.Country from [Customer] a
group by a.Country
having count(*) = (select min(b.Tot) from (SELECT COUNT(*) AS Tot FROM [Customer] GROUP BY Country) b)
答案 2 :(得分:0)
如果您当时没有使用sql 2012,
声明@Fewer int = 2 ;用CTE作为 ( 选择c。* ,ROW_NUMBER()结束(按customerid的countryid顺序分区)rn 来自dbo.Customers C
)
从cte中选择* 其中rn< = @更少