首页 > 解决方案 > 为什么 COUNT() 与 MS SQL Server 中的 SELECT TOP 一起使用或不使用?

问题描述

我刚刚开始学习 MS SQL Server,遇到了一个问题,即从 HackerRank 上的数据库中找到 LAT_N 的中值。 这就是问题所在。 如果不登录就无法查看上述链接,这是数据库架构。

这是我的代码。

SELECT 
CASE
    WHEN COUNT(LAT_N)%2=0 THEN TOP COUNT(LAT_N)/2 LAT_N
    ELSE TOP COUNT(LAT_N)/2+1 LAT_N
END as col1
INTO T1
FROM STATION
ORDER BY LAT_N ASC;

SELECT TOP COUNT(LAT_N)/2 LAT_N AS col2
INTO T2
FROM STATION
ORDER BY LAT_N DESC;

SELECT TOP 1 col1
FROM T1
ORDER BY LAT_N DESC;

SELECT TOP 1 col2
FROM T2
ORDER BY LAT_N ASC;

我得到了这里的错误:

Msg 156, Level 15, State 1, Server dbrank-tsql, Line 4
Incorrect syntax near the keyword 'TOP'.

所以我决定在 W3schools 上的一个小型数据库上尝试一下。 这里是编辑器。

此查询有效:

SELECT TOP 3 *
FROM Customers;

但这不会:

SELECT TOP COUNT(*)/2 * 
FROM Customers;

有人可以解释一下:

  1. 为什么它不起作用和
  2. 如何使 TOP COUNT(*)/2 工作。

标签: sql-server

解决方案


你的 SQL 没有意义。TOP后面需要一个标量值,如果是表达式,则需要放在括号 ( ()) 中。SELECT TOP COUNT(*)/2 * 没有意义,你想要TOP 什么?然后你有COUNT(*)/2 *什么然后乘以那个值?您缺少表达式的一部分。

对于SELECT TOP COUNT(LAT_N)/2 LAT_N AS col2. TOP 什么?_ 您缺少您的值TOP,然后直接要求除以 2COUNT的非NULL值中的一个。然后看起来您缺少一个逗号,但考虑到您要返回它的a需要在您的所以它不清楚你的目标是什么。LAT_NCOUNTLAT_NGROUP BY

如果您在表格的上“一半”之后,(来自您的评论“如何使 TOP COUNT( )/2 工作。”*)使用TOP(50 PERCENT)

SELECT TOP (50 PERCENT)
       *
FROM dbo.CUSTOMERS
ORDER BY ???;

推荐阅读