如何在SQL Server 2012的选择查询中将值设置为变量?
我想为一个复杂的查询生成一个序列。为此,我使用了一个变量@rowNo 我的逻辑是: 如果字段-isremoved=0,则将行号增加1。 如果isremoved=1,则只将行数增加1一次,直到找到下一个0 这是到目前为止我所做的,但它给了我语法错误如何在SQL Server 2012的选择查询中将值设置为变量?,sql,variables,sql-server-2012,setvalue,Sql,Variables,Sql Server 2012,Setvalue,我想为一个复杂的查询生成一个序列。为此,我使用了一个变量@rowNo 我的逻辑是: 如果字段-isremoved=0,则将行号增加1。 如果isremoved=1,则只将行数增加1一次,直到找到下一个0 这是到目前为止我所做的,但它给了我语法错误 DECLARE @rowNo INT; SET @rowNo = -1; SELECT case when sampleTable.isremoved = 0 then @rowNo + 1 else @rowNo end as rowNum
DECLARE @rowNo INT;
SET @rowNo = -1;
SELECT
case when sampleTable.isremoved = 0 then @rowNo + 1
else @rowNo end
as rowNumber,
X,
Y,
Z
.
.
FROM tbl_sample sampleTable
INNER JOIN tbl_sample_2 sample2 ON sampleTable.id = sample2.id
.
.
.
这是我的愿望输出:-
那么,在sql server 2012中实现此类功能的正确方法是什么
编辑:-
我有一个解决方案,可以使用子查询来检索行号。但这将影响性能,因为这是一个非常复杂的查询,需要20多个连接和大量数据。
因此,请给我推荐一种替代方法。一种方法是使用子查询:
Select (Select count(*) from tbl_sample
where id <= a.id
and a.isRemoved =1) rowNumber,
X, Y, Z
From tbl_sample a
Join tbl_sample_2 b
On b.id = a.id
在SQL Server 2012+中,您可以使用累积总和执行任何操作:
SELECT sum(case when sampleTable.isremoved = 0 then 1 else 0 end) over
(order by . . .)
. . .
order by应在外部查询中重复order by。您也可以通过选择null来尝试使用order。根据我的经验,这在外部查询中使用了数据的排序,但这并没有文档记录始终有效
SQL Server不允许您在选择中设置变量并在结果集中返回值。一个或另一个,但不是两个。我假设您的行数逻辑等价于:如果previous isremoved=0,则将行数增加1,否则保持原样
使用滞后和求和的组合。。。通过这种方式,您可以轻松实现以下逻辑:
SELECT id, isremoved,
SUM(IIF(prevFlag = 0, 1, 0)) OVER (ORDER BY id) AS rowNumber
FROM (
SELECT a.id, isremoved,
COALESCE(LAG(isremoved) OVER (ORDER BY a.id), isremoved) AS prevFlag
FROM tbl_sample AS a
INNER JOIN tbl_sample_2 AS b ON b.id = a.id) AS t
看一看这个:是的,这是正确的。我为混淆道歉。我已经更新了问题。这张图片完美地代表了我的结果,以防你们仍然感到困惑。这是一个非常复杂的查询,几乎有20个连接。因此,这种解决方案会影响性能。是的,它会,但是,假设其中一个id列是外键,如果在其上放置索引,则会将性能影响降至最低。您的解决方案适合POC。但它不适用于我的实际查询。我很快会带着确切的问题回来。这是正确的解决方案。但有一个问题,我使用的是order by。这会改变行号。此处演示-@未知我不确定我是否了解您的实际需求。如果您的行是按seq而不是id排序的,那么在窗口函数的OVER子句中使用此字段而不是id。我只想在结果上应用“orderby”。不要与名称seq混淆。让我们假设有一个名称字段,我试图根据它排序。同样的情况也会发生。@unknown这是不可能的。这就像想同时以两种不同的方式对单个字段进行排序。