首页 > 解决方案 > T-SQL QUERY , COUNT WITH TRAILER RECORD

问题描述

我有一个代码,它以 Alert 程序开头,然后是 header、detail 和 trailer 语句,当我使用 select distinct 表示 header、detail 时,在 header 和 detail 之间有联合命令,所以我想知道我是否可以得到特定列中尾部行中的标题和详细信息的记录总数..现在我已经使用了

CONVERT(bigint, count(*) ) as Recordcount,

但它显示为 498 行 .. 但我们最初有 475 行关于拖车行。我认为它正在计算 sql 查询行的总数..

标签: sqlsql-servertsqlssms

解决方案


COUNT(*)确实计算数据集中的总行数;包括完全由 value 组成的任何行NULL。举个例子:

WITH VTE AS(
    SELECT CONVERT(int,NULL) AS N
    UNION ALL
    SELECT CONVERT(int,NULL) AS N
    UNION ALL
    SELECT CONVERT(int,NULL) AS N
    UNION ALL
    SELECT CONVERT(int,NULL) AS N
    UNION ALL
    SELECT CONVERT(int,NULL) AS N
    UNION ALL
    SELECT 1 AS N)
SELECT COUNT(*)
FROM VTE;

请注意,这返回 6,而不是 1。如果您想要值 1,那么您需要使用COUNT(N).

没有样本数据,这纯粹是猜测,但我想你需要使用COUNT表达式CASE,只包含不是页眉或页脚的行。这是伪 SQL,但是,它将类似于:

COUNT(CASE WHEN <<Some expression that determines a row instead a header/footer>> THEN 1 END)

此外,没有理由使用CONVERT(BIGINT,COUNT(<<expr>>). 如果您正在执行可能返回多2^31-1行的计数,请使用COUNT_BIG. 如果您不打算返回多于2^31-1行,那么只需使用COUNT(您将返回 <500 行,因此实际上没有理由使用 a bigint)。


推荐阅读