【问题标题】:Count rows from a seperate query从单独的查询中计算行数
【发布时间】:2016-01-20 15:15:03
【问题描述】:

好的,我已尝试搜索此问题的答案,但似乎找不到。我正在使用 SQL Server 2012。我正在提取将要写入平面文件的数据。在平面文件的开头和结尾,我需要一个包含特定数据的页眉和页脚。我的问题出现在页脚中,因为我需要数据集中的行数。现在我已经设置了我的查询。这是为了尝试获取行数而简化的。

select 'header'
union
select mytable.data
from mytable
union
select 'footer'+convert(varchar(4),ROWCOUNT)

因此,查询可以根据平面文件的需要进行,我只需使用 mytable.data 中的行数填充 ROWCOUNT。

预期输出

Header|04||160119|||2.0|160119||
D|||||...
D|||||...
Footer|ROWCOUNT||blank||

更新: 于是就这样写了代码

select 'header'
union all
select mytable.data
from mytable
union all
select 'footer'+convert(varchar(4),@@Rowcount)

它开始工作了。不完全确定为什么@@Rowcount 现在还不早开始工作,但现在可以工作了。谢谢大家帮助我解决这个问题。

【问题讨论】:

  • 我添加了预期的输出

标签: sql sql-server sql-server-2012 rowcount


【解决方案1】:

您的查询将如下所示:

select 'header'
union
select mytable.data
from mytable
union
select 'footer '+CAST((SELECT COUNT(*) FROM mytable) AS VARCHAR(16));

【讨论】:

  • 我会使用 UNION ALL 而不是 UNION。
  • UNION 将返回不同的值,因此重复项不会包含在正文中。然而,它们将被计入页脚
  • 中间查询确实有一个不同的正在运行,因此 union 或 union all 仍会提取相同的结果。 Union只是添加页眉和页脚
  • @CalebJohnson UNION 将明确检查重复项并将其删除,UNION ALL 不会。 UNION ALL 会比 UNION 表现更好。
  • @CalebJohnson 另外,如果您的中间查询很复杂,最好将其编写为 CTE (;WITH cte AS (<your query>) ...) 并在 SELECT 语句中使用 CTE,而不是复制整个中间查询以获得最后一个查询中的 COUNT。
【解决方案2】:

您也可以使用CTE 试试这个 -

;With dataCTE
AS
(
    select data, COUNT(*) over() as RowCnt
    from mytable
),
footerCTE
AS
(
    select 'footer'+convert(varchar(4),RowCnt) as data from dataCTE
)
select 'header' AS data
union
select data from dataCTE
union
select data from footerCTE

【讨论】:

  • 我试过这个方法。仅使用联合为我提供了我需要的所有数据,但标题不会停留在顶部。如果我合并所有页眉都留在顶部,但页脚重复 125 次
【解决方案3】:

你可以像下面这样尝试

     with cte
    as
    ( select 'header' as h
union
select mytable.data as h
from mytable
    )
    select * from cte
    select 'footer'+convert(varchar(4),@@ROWCOUNT)

【讨论】:

  • 收到此错误消息 8155,级别 16,状态 2,第 2 行没有为“cte”的第 1 列指定列名。
  • 已编辑,我的测试数据包含列,但在粘贴时我拿走了你的数据。现在更正
  • 所以我拿出了很多你的代码,换个时间试试。但是离开了 'footer'+convert(varchar(4),@@ROWCOUNT) 突然间它开始工作了我也想要它...我完全不知道为什么@@Rowcount 之前没有工作
  • @CalebJohnson:但是这个脚本会为您提供表记录的计数,包括 'header' 记录,这不是您的实际表记录!另一件事是上面的查询给出了两个结果集而不是一个
猜你喜欢
  • 1970-01-01
  • 2018-01-19
  • 2015-11-17
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多