Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL中的计算列有问题_Sql_Sql Server 2008_Calculated Columns_Nested Queries - Fatal编程技术网

SQL中的计算列有问题

SQL中的计算列有问题,sql,sql-server-2008,calculated-columns,nested-queries,Sql,Sql Server 2008,Calculated Columns,Nested Queries,我有一个表,我希望从中选择列的子集,但还要根据您在队列中的位置在表的末尾添加一个计算列。有以下相关字段: id:int,自动递增,主键 应答时间:日期时间,可为空 默认情况下,当某个内容提交到队列时,其应答时间为空。因此,我希望选择队列中事物的ID及其在队列中的排名,即排名1是下一个未回答的项目,等等。我的想法如下: rank-id-countid在我的id下,应答时间不为空。但是,我对这个查询的语法有一个问题: SELECT id AS outerid, COUNT( SELECT *

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

id:int,自动递增,主键 应答时间:日期时间,可为空

默认情况下,当某个内容提交到队列时,其应答时间为空。因此,我希望选择队列中事物的ID及其在队列中的排名,即排名1是下一个未回答的项目,等等。我的想法如下:

rank-id-countid在我的id下,应答时间不为空。但是,我对这个查询的语法有一个问题:

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实现,还是需要在程序端添加一些逻辑


如果有帮助的话,我会在SQLServer2008上这样做,尽管我怀疑这会增加任何价值

可以这样做,但不能在聚合子查询中使用SELECT*。尝试此操作,它将计数值作为标量结果获取:

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*、COUNTId或其他列之间进行选择,具体取决于您真正想要的内容。

您可以这样做,但不能在聚合子查询中使用SELECT*。尝试此操作,它将计数值作为标量结果获取:

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;
SELECT id AS outerid,
(SELECT COUNT(*) FROM tablename WHERE id < outerid AND answertime IS NOT NULL) AS othercol
FROM tablename -- ?
WHERE answertime IS NULL;
您可能需要自己选择使用COUNT*、COUNTId或其他列,具体取决于您真正想要的内容

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语句在哪里


另外,FROM语句在哪里?

正如@HLGEM所建议的,您可以使用ROW_NUMBER来获得结果。该方法包括按id对tablename中的行进行排序,不进行分区,按id对tablename中的行进行排序,并按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

正如@HLGEM所建议的,您可以使用ROW_NUMBER来获得结果。该方法包括按id对tablename中的行进行排序,不进行分区,按id对tablename中的行进行排序,并按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

没有时间给出一个很好的例子,但要查找行数函数。如果我理解正确,我想这将是你想要的。没有时间给出一个好的例子,但查找行数函数。如果我理解正确,我想这将是你想要的;我漏掉了表名outie位,因此它可以区分ID。谢谢或者从tablename中选择COUNTanswertime,其中id