34,588
社区成员
发帖
与我相关
我的任务
分享
create TABLE #Good(GoodsID VARCHAR(3),GoodsName VARCHAR(4))
INSERT INTO #Good
SELECT '001','苹果' UNION ALL
SELECT '002','橙' UNION ALL
SELECT '003','梨'
create TABLE #GoodIn (GoodsID VARCHAR(3),Qty INT)
INSERT INTO #GoodIn
SELECT '001',10 UNION ALL
SELECT '001',20 UNION ALL
SELECT '002',10 UNION ALL
SELECT '002',20 UNION ALL
SELECT '003',20 UNION ALL
SELECT '003',30
create TABLE #GoodOut(GoodsID VARCHAR(3),Qty INT)
INSERT INTO #GoodOut
SELECT '001',1 UNION ALL
SELECT '001',2 UNION ALL
SELECT '002',1 UNION ALL
SELECT '002',2 UNION ALL
SELECT '003',2 UNION ALL
SELECT '003',3
create TABLE #GoodStorage (GoodsID VARCHAR(3),Qty INT)
INSERT INTO #GoodStorage
SELECT '001',27 UNION ALL
SELECT '002',27 UNION ALL
SELECT '003',45
/*
GoodsID GoodsName QtyIn(进货) QtyOut(出货) Qty(存货)
001 苹果 30 3 27
002 橙 30 3 27
003 梨 50 5 45
*/
select sum(g1.Qty) '进货',sum(g2.Qty) '出货',sum(g4.Qty) '存货'
from #GoodIn g1 join #GoodOut g2 on g1.GoodsID=g2.GoodsID join
#GoodStorage g4 on g4.GoodsID=g1.GoodsID group by g1.GoodsID
select g3.GoodsID,g3.GoodsName,g3.Qty '进货',g4.Qty '出货',g5.Qty '存货' from
(select g1.GoodsID,g1.GoodsName,sum(g2.Qty) Qty from #Good g1 join #GoodIn g2
on g1.GoodsID=g2.GoodsID group by g1.GoodsID,g1.GoodsName) g3 join
(select GoodsID,sum(Qty) Qty from #GoodOut group by GoodsID) g4 on g4.GoodsID=g3.GoodsID
join (select GoodsID,sum(Qty) Qty from #GoodStorage group by GoodsID) g5 on g4.GoodsID=g5.GoodsID
create table #tb([Name] int ,[Type] varchar(10),YN varchar(10))
insert into #tb values(1,'A','Y')
insert into #tb values(3,'B','Y')
insert into #tb values(4,'B','Y' )
insert into #tb values(3,'A','N')
insert into #tb values(4,'A','Y')
insert into #tb values(4,'B','Y')
insert into #tb values(1,'C','N')
--Name A&Y A&N B&Y B&N C&Y C&N
select [Name],
sum(case when [Type]=N'A' and YN=N'Y' then 1 else 0 end) 'A&Y',
sum(case when [Type]=N'A' and YN=N'N' then 1 else 0 end) 'A&N',
sum(case when [Type]=N'B' and YN=N'Y' then 1 else 0 end) 'B&Y',
sum(case when [Type]=N'B' and YN=N'N' then 1 else 0 end) 'B&N',
sum(case when [Type]=N'C' and YN=N'Y' then 1 else 0 end) 'C&Y',
sum(case when [Type]=N'C' and YN=N'N' then 1 else 0 end) 'C&N'
from #tb group by [Name]
if object_id('RR') is not null drop table RR
create table RR
(
product varchar(20),
[111(shu1)] int,
[111(shu2)] int,
[222(shu1)] int,
[222(shu2)] int
)
insert into RR
select E1.product,E1.shu1 '111(shu1)' ,E1.shu2 '111(shu2)',E2.shu1,E2.shu2 from
(select product,sum(shu1) as shu1,sum(shu2) as shu2 from #EE where shop=111 group by product) E1
join (select product,sum(shu1) as shu1,sum(shu2) as shu2 from #EE where shop=222 group by product) E2
on E1.product=E2.product
select * from RR
create table #t(部门 char(1),员工 Nchar(2),工资 int)
insert into #t select 'A',N'李',1000
insert into #t select 'B',N'王',2000
insert into #t select 'A',N'张',3000
insert into #t select 'B',N'赵',4000
select
部门=case when grouping(部门)=0 and grouping(员工)=1 then N'合计' else 部门 end,
员工 = isnull(员工,''),
工资 = sum(工资)
from
#t
group by
部门,员工
with rollup
having grouping(部门)=0
drop table #t
/*部门 员工 工资
---- ---- -----------
A 李 1000
A 张 3000
合计 4000
B 王 2000
B 赵 4000
合计 6000
(影響 6 個資料列)
*/
/*GROUPING
是一个聚合函数,它产生一个附加的列,当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0。
仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相联系的选择列表中才允许分组。
语法
GROUPING ( column_name )
参数
column_name
是 GROUP BY 子句中用于检查 CUBE 或 ROLLUP 空值的列。
返回类型
int
参考资料:SQL Server T-SQL帮助*/
GROUPING
是一个聚合函数,它产生一个附加的列,当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0。
仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相联系的选择列表中才允许分组。
语法
GROUPING ( column_name )
参数
column_name
是 GROUP BY 子句中用于检查 CUBE 或 ROLLUP 空值的列。
返回类型
int
注释
分组用于区分由 CUBE 和 ROLLUP 返回的空值和标准的空值。作为CUBE 或 ROLLUP 操作结果返回的 NULL 是 NULL 的特殊应用。它在结果集内作为列的占位符,意思是"全体"。
示例
下面的示例将 royalty 的数值分组,并聚合 advance 的数值。GROUPING 函数应用于 royalty 列。
USE pubs
SELECT royalty, SUM(advance) 'total advance',
GROUPING(royalty) 'grp'
FROM titles
GROUP BY royalty WITH ROLLUP
结果集在 royalty 下显示两个空值。第一个 NULL 代表从表中这一列得到的空值组。第二个 NULL 在 ROLLUP 操作所添加的汇总行中。汇总行显示的是所有 royalty 组的 advance 合计数值,并且在 grp 列中用 1 标识。
下面是结果集:
royalty total advance grp
--------- --------------------- ---
NULL NULL 0
10 57000.0000 0
12 2275.0000 0
14 4000.0000 0
16 7000.0000 0
24 25125.0000 0
NULL 95400.0000 1
DECLARE @t TABLE(Groups char(2),Item varchar(10),Color varchar(10),Quantity int)
INSERT @t SELECT 'aa','Table','Blue', 124
UNION ALL SELECT 'bb','Table','Red', -23
UNION ALL SELECT 'bb','Cup' ,'Green',-23
UNION ALL SELECT 'aa','Chair','Blue', 101
UNION ALL SELECT 'aa','Chair','Red', -90
--汇总显示
SELECT Groups=CASE
WHEN GROUPING(Color)=0 THEN Groups
WHEN GROUPING(Groups)=1 THEN '总计'
ELSE '' END,
Item=CASE
WHEN GROUPING(Color)=0 THEN Item
WHEN GROUPING(Item)=1 AND GROUPING(Groups)=0 THEN Groups+' 合计'
ELSE '' END,
Color=CASE
WHEN GROUPING(Color)=0 THEN Color
WHEN GROUPING(Color)=1 AND GROUPING(Item)=0 THEN Item+' 小计'
ELSE '' END,
Quantity=SUM(Quantity)
FROM @t
GROUP BY Groups,Item,Color WITH ROLLUP
/*--结果
Groups Item Color Quantity
-------- ---------------- ---------------------- -----------
aa Chair Blue 101
aa Chair Red -90
Chair 小计 11
aa Table Blue 124
Table 小计 124
aa 合计 135
bb Cup Green -23
Cup 小计 -23
bb Table Red -23
Table 小计 -23
bb 合计 -46
总计 89
--*/