2013-02-28 81 views
0

这是需要两个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 

这将返回: enter image description here

我怎样才能调整代码而不是实际显示卷起的行?意思是删除最后3行或与[]有什么关系。我需要在SQL 2005中使用Rollup,因此我可以使用case grouping

+1

你有试过什么吗? – Kermit 2013-02-28 22:02:25

+0

我不知道该怎么做。无法使用'GROUPING SETS(())',因为2005年不支持它(或者需要将兼容性调整为90,这是我无法做到的,忘记了为什么我不能使用它的实际原因)。我可以删除'WITH ROLLUP',它可以在2008年运行,但是2005年需要它。 – JohnZ 2013-02-28 22:07:27

回答

1

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

但是我不知道为什么你不能做这样的事情,而不是你一个临时表中描述的混乱:

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

这工作得很好。我不能对表示层做任何事情,因为我不是负责它的人或者做任何事情。我只负责获取要显示的数据。 – JohnZ 2013-02-28 22:56:41

0

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

+1

这似乎是一个非常低效的解决方案。由于表示层必须遍历所有行以显示数据,因此该代码决定何时显示各个值是否合理? – 2013-02-28 22:33:02

+0

这段代码发送到服务器,它全部在那里处理,并且演示文稿(网站)仅显示我的最终选择查询。在我提供的代码中,我还能怎么做呢? – JohnZ 2013-02-28 22:35:40

+0

“只显示我的最终选择查询”是什么意思?它必须遍历结果才能显示它们,对吗? – 2013-02-28 22:37:13

0

为什么不使用CTE来代替?如果不希望汇总所产生的所有行,则返回到基本组 - 但在CTE内执行,例如, 与CTE为( <> ) SELECT * FROM CTE从CTE UNION ALL 选择总和(每场) - 即总计

您可能必须在CTE输出引入一个常数(例如1),并在最后一行输出2以确保其正确订购。