无论如何,UNION的行数是否作为自己的行返回的记录数?

时间:2013-09-16 18:41:24

标签: sql sql-server-2008 union

有没有其他方法可以将rowcount放入,而无需进行联合并指定所有其他列?

例如,假设我创建了#faketable有4列A, B, C, D,然后我这样做了:

select * from #faketable
union
select COUNT(*) from #faketable

这不起作用,因为我没有相同数量的列。

我想避免做的是:

select * from #faketable
union
select COUNT(*), null, null, null from #faketable

行计数不能作为列附加,它必须是它自己的行。有什么想法吗?

在这个例子中,输入三个NULLS很好,但如果我有100列,那该怎么办呢?不可能为每列不断添加空值。我试图避免为每列指定一个null。

2 个答案:

答案 0 :(得分:0)

<强>更新

我认为你想要的是

SELECT Table1.A, Table1.B, Table1.C, Table1.D, COUNT(*)
FROM #faketable as Table1

我的语法可能搞砸了一点,但你根本不需要联盟。

我认为您正在尝试做什么

如果我理解正确的问题,我认为你想要这样做

SELECT * FROM #faketable
UNION
SELECT COUNT(A),COUNT(B),COUNT(C), COUNT(D) FROM #faketable

如果您出于报告目的这样做我建议使用报告软件,这种类型的东西不是SQL SERVER的用途。

答案 1 :(得分:0)

运行查询后,系统变量@@ROWCOUNT将具有所选的行数。所以你可以这样做。

select * from faketable
union
select @@ROWCOUNT, null, null, null

但是,这并不会强制RowCount位于最后一行。

您可以使用Common Table Expression轻松完成此操作。你也可以做一个大的子查询,但我更喜欢CTE。基本上使用此解决方案,我添加了一个SortOrder列以强制行计数结束,然后只是在结果中不包括该列。

;with myCTE as
(
  select 1 as SortOrder, A, B, C, D from faketable
  union
  select 2 as SortOrder, @@ROWCOUNT, null, null, null
)
select datatype, A, B, C, D
from myCTE
order by SortOrder
GO

您可以在 SQLFiddle 上查看两个查询。如果你进行一些研究,你可能会找到一种更好的方法来完成两个UNION查询的排序顺序,但这会让你顺利。