SQL中的计算列出现问题

时间:2012-01-20 19:22:31

标签: sql sql-server-2008 calculated-columns nested-queries

我有一个表,我希望从中选择一个列的子集,但最后根据您在队列中的位置添加一个计算列。有以下字段(相关):

id:int,auto increment,primary key answertime:datetime,nullable

默认情况下,当某些内容提交到队列时,其answertime为NULL。所以,我希望选择队列中的东西的ID以及它在队列中的排名(即排名1是未答复的下一个项目等)。这就是我的想法:

rank - id - COUNT(我的id下面的id,其中answertime不为null)。但是,我遇到了此查询语法的问题:

SELECT id AS outerid, COUNT(
    SELECT * FROM tablename WHERE id<outerid AND answertime IS NOT NULL
)
FROM tablename 
WHERE answertime IS NULL;

现在,显然,这是错误的,因为我非常有信心你不能在聚合函数中嵌入一个select,同样翻转SELECT和COUNT不起作用,因为你不能在那个时候嵌入SELECT在代码中(它只能在WHERE子句中使用)。

这甚至可以用SQL做,还是需要在程序端添加一些逻辑?

如果它有帮助,我在SQL Server 2008上这样做,虽然我怀疑这会增加任何价值。

3 个答案:

答案 0 :(得分:3)

您可以这样做,您只是不能在聚合子查询中使用SELECT *。试试这个,它将COUNT值作为标量结果:

SELECT
   id AS outerid,
   (SELECT COUNT(Id) FROM tablename
    WHERE id<outie.id AND answertime IS NOT NULL)
FROM tablename outie
WHERE answertime IS NULL;

根据您的真实情况,您可能需要在使用COUNT(*)COUNT(Id)或其他列之间自行选择。

答案 1 :(得分:1)

SELECT id AS outerid,
(SELECT COUNT(*) FROM tablename WHERE id < outerid AND answertime IS NOT NULL) AS othercol
FROM tablename -- ?
WHERE answertime IS NULL;

另外,FROM语句在哪里?

答案 2 :(得分:0)

根据@HLGEM的建议,您可以使用ROW_NUMBER()来获取结果。该方法涉及将tablename中的行按id排序,而不将{em>和按id分区,并按answertime进行分区。 answertime为NULL的每一行的排名之间的差异将为您提供与使用子查询中的COUNT()计算的值相同的值。

以下是该方法的实现:

;
WITH ranked AS (
  SELECT
    *,
    Rnk     = ROW_NUMBER() OVER (                        ORDER BY id),
    PartRnk = ROW_NUMBER() OVER (PARTITION BY answertime ORDER BY id)
  FROM tablename
)
SELECT
  id,  /* AS outerid, if you like */
  Cnt = Rnk - PartRnk
FROM ranked
WHERE answertime IS NULL