在存储过程中将行数​​获取到变量中

时间:2019-02-28 22:33:52

标签: sql sql-server

以下查询给了我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

我需要的是将2714放入变量中的选择。像

select @numTotalOpenSalesOrders=count(soh.A_Import_Set_No)

但是那给了我2714行“ 1”。我尝试使用SUM来查看是否可以将所有1加起来,但这没用。

2 个答案:

答案 0 :(得分:1)

您的查询实际2714条记录。

如果只想计算结果集中的记录数,则只需将其包装到SELECT COUNT(*) FROM (<your query>)中即可:

SELECT @numTotalOpenSalesOrders = COUNT(*) 
FROM (
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
) x

另外,通过查看您的查询,似乎可以通过多种方式对其进行简化:

  • left join OpenSalesOrdersL sol on sol.Number = soh.No where sol.Number IS NOT NULL:在功能上等同于INNER JOIN

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

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

我真的怀疑这整个过程可以简化为:

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

答案 1 :(得分:1)

嗯。 。 。我认为这可以满足您的要求:

select count(*)
from OpenSalesOrdersH soh
where exists (select 1
              from OpenSalesOrdersL sol
              where sol.Number = soh.No and
                    sol.line_no is not null
             );

这种方法的优点是您可以使用OpenSalesOrdersL(Number, line_no)上的索引对其进行优化,因此它也应该非常快。

哦,然后将值放在变量中:

select @cnt = count(*)
. . .