【问题标题】:Showing rollup in last line only仅在最后一行显示汇总
【发布时间】:2013-02-28 21:57:59
【问题描述】:

这需要在 SQL Server 2005 和 2008 中工作,而无需调整兼容性级别(如果可以的话)

Select 
    CASE GROUPING([Store ID]) WHEN 1 THEN '[Store ID]' ELSE [Store ID] END [Store ID],
    CASE GROUPING([Cashier]) WHEN 1 THEN '[Cashier]' ELSE [Cashier] END [Cashier],
    CASE GROUPING([Register]) WHEN 1 THEN '[Register]' ELSE [Register] END [Register],
    sum([Amex]) AS [Amex],
    sum([C.Card]) AS [C.Card],
    sum([Cash]) AS [Cash],
    sum([House Acct]) AS [House Acct],
    sum([MasterCard]) AS [MasterCard],
    sum([Str Cr]) AS [Str Cr],
    sum([Visa/MC]) AS [Visa/MC] 
from 
    #a13 
group by 
    [Store ID],
    [Cashier],
    [Register] 
with rollup

这会返回:

如何调整代码以不实际显示卷起的行?意思是删除最后 3 行或其中带有 [ ] 的任何内容。我需要在 SQL 2005 中使用 Rollup,以便可以使用 case grouping

【问题讨论】:

  • 你有没有尝试过?
  • 我不知道该怎么做。无法使用GROUPING SETS(()),因为2005不支持(或者需要将兼容性调整到90我做不到,忘记了我不能使用它的实际原因)。我可以删除WITH ROLLUP,它可以在 2008 年使用,但 2005 年需要它。

标签: sql-server-2008 sql-server-2005 rollup


【解决方案1】:

现在我对这个问题有了更好的理解,我的第一个建议是让你的表示层更聪明一点,而不是只管数据库发送给它的任何东西。

但是我不确定为什么你不能做这样的事情,而不是你用临时表描述的混乱:

SELECT * FROM 
(
  ...your query above...
) AS x
WHERE Register <> '[Register]';

【讨论】:

  • 这很好用。我不能对表示层做任何事情,因为我不是负责人或对它做任何事情的人。我只是负责获取要显示的数据。
【解决方案2】:

没关系,我只是将这些结果放入临时表中,删除了这些行,然后从临时表中选择。

【讨论】:

  • 这似乎是一个非常低效的解决方案。由于您的表示层必须遍历所有行以显示数据,因此该代码决定何时显示各个值是否有意义?
  • 此代码进入服务器,所有内容都在那里处理,演示文稿(网站)仅显示我的最终选择查询。在提供的代码中我还能怎么做?
  • “仅显示我的最终选择查询”是什么意思?它必须循环显示结果,对吗?
  • 该网站只查看和处理select * from #temp 结果,它只有 1 行,其中没有包含 [ ] 的行。所有处理等都在 SQL 服务器上完成。
【解决方案3】:

为什么不改用 CTE?如果您不想要汇总生成的所有行,请返回到基本组 - 但在 CTE 中执行,例如 CTE 为 ( ) 从 cte 中选择 * 联合所有 从 CTE 中选择总和(每个字段)——即总计

您可能必须在 CTE 输出中引入一个常量(例如 1)并在最后一行中输出 2 以确保其正确排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 2012-10-08
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2022-09-15
    相关资源
    最近更新 更多