Sql 获取存储过程中变量的行数

Sql 获取存储过程中变量的行数,sql,sql-server,tsql,group-by,count,Sql,Sql Server,Tsql,Group By,Count,以下查询提供了2714行: SELECT soh.No FROM OpenSalesOrdersH soh LEFT JOIN OpenSalesOrdersL sol ON sol.Number = soh.No WHERE sol.Number IS NOT NULL GROUP BY soh.No HAVING COUNT(sol.line_no) > 0 我需要的是一个select,它将2714放入一个变量中。差不多 select @numTotalOpenSalesOrders

以下查询提供了2714行:

SELECT soh.No
FROM OpenSalesOrdersH soh
LEFT JOIN OpenSalesOrdersL sol ON sol.Number = soh.No
WHERE sol.Number IS NOT NULL
GROUP BY soh.No
HAVING COUNT(sol.line_no) > 0
我需要的是一个select,它将2714放入一个变量中。差不多

select @numTotalOpenSalesOrders=count(soh.A_Import_Set_No)

但这只给了我2714行“1”。我试着求和,看看是否能把所有的1加起来,但没有用。

你的查询实际上有2714条记录

如果您只想计算结果集中的记录数,那么只需将其包装成一个
选择count(*)FROM()


此外,通过查看您的查询,似乎可以通过以下几种方式简化查询:

  • 左连接opensalesordsl sol on sol.Number=soh.No其中sol.Number不为空
    :这在功能上等同于
    内部连接

  • having count(sol.line_no)>0
    having
    子句将始终为真(参见上一点)

  • group by soh.No
    :由于没有聚合函数发挥作用,因此没有真正的用处

我真的怀疑这整件事可以简化为:

SELECT @numTotalOpenSalesOrders = COUNT(DISTINCT soh.No)
FROM OpenSalesOrdersH soh
INNER JOIN OpenSalesOrdersL sol ON sol.Number = soh.No

您的查询实际上包含2714条记录

如果您只想计算结果集中的记录数,那么只需将其包装成一个
选择count(*)FROM()


此外,通过查看您的查询,似乎可以通过以下几种方式简化查询:

  • 左连接opensalesordsl sol on sol.Number=soh.No其中sol.Number不为空
    :这在功能上等同于
    内部连接

  • having count(sol.line_no)>0
    having
    子句将始终为真(参见上一点)

  • group by soh.No
    :由于没有聚合函数发挥作用,因此没有真正的用处

我真的怀疑这整件事可以简化为:

SELECT @numTotalOpenSalesOrders = COUNT(DISTINCT soh.No)
FROM OpenSalesOrdersH soh
INNER JOIN OpenSalesOrdersL sol ON sol.Number = soh.No

嗯。我想这正是你想要的:

select count(*)
from OpenSalesOrdersH soh
where exists (select 1
              from OpenSalesOrdersL sol
              where sol.Number = soh.No and
                    sol.line_no is not null
             );
这种方法的优点在于,您可以使用
opensalesordsl(Number,line_no)
上的索引对其进行优化,因此它也应该相当快

哦,要将值放入变量中:

select @cnt = count(*)
. . .

嗯。我想这正是你想要的:

select count(*)
from OpenSalesOrdersH soh
where exists (select 1
              from OpenSalesOrdersL sol
              where sol.Number = soh.No and
                    sol.line_no is not null
             );
这种方法的优点在于,您可以使用
opensalesordsl(Number,line_no)
上的索引对其进行优化,因此它也应该相当快

哦,要将值放入变量中:

select @cnt = count(*)
. . .

很好的解释!愚蠢的联合总会把我搞砸。欢迎@Dizzy49!很好的解释!愚蠢的联合总会把我搞砸。欢迎@Dizzy49!