看到一个帖子 我自己小结了一写
这个能实现 汇总和分页:
表:
合同 代码 数量
1 01.01.01.001 5
1 02.01.01.001 20
2 01.01.01.001 200
2 02.01.02.001 300
declare @ta table(合同 int,代码 varchar(50),数量 int)
insert @ta select 1, '01.01.01.001', 5
union all select 1, '02.01.01.001', 20
union all select 2, '01.01.01.001', 200
union all select 2, '02.01.02.001', 300
select case when grouping(合同)=1 then '合计' else rtrim(合同) end as 1,
[原料]=sum(case when left([代码],2)='01' then 数量 else 0 end) as 2 ,
[辅料]=sum(case when left([代码],2)='02' then 数量 else 0 end) as 3 ,
sum(数量)as '合计'
from @ta
group by 合同 with rollup
合同 原料 辅料 合计
------------ ----------- ----------- -----------
1 5 20 25
2 200 300 500
合计 205 320 525
(3 行受影响)
关键: case 语句的使用
grouping :成员组的用法。
一个很好的例子:
CUBE 操作所生成的空值带来一个问题:如何区分 CUBE 操作所生成的 NULL 值和从实际数据中返回的 NULL 值?这个问题可用 GROUPING 函数解决。如果列中的值来自事实数据,则 GROUPING 函数返回 0;如果列中的值是 CUBE 操作所生成的 NULL,则返回 1。在 CUBE 操作中,所生成的 NULL 代表全体值。可将 SELECT 语句写成使用 GROUPING 函数将所生成的 NULL 替换为字符串 ALL。因为事实数据中的 NULL 表明数据值未知,所以 SELECT 语句还可译码为返回字符串 UNKNOWN 替代来自事实数据的 NULL。例如:
SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL' ELSE ISNULL(Item, 'UNKNOWN') END AS Item, CASE WHEN (GROUPING(Color) = 1) THEN 'ALL' ELSE ISNULL(Color, 'UNKNOWN') END AS Color, SUM(Quantity) AS QtySum FROM Inventory GROUP BY Item, Color WITH CUBE