请教个分组汇总的问题

月光下的土豆 2017-06-19 10:29:21

CREATE TABLE #pay
(
管理部 NVARCHAR(50),
直间接 NVARCHAR(50),
合同类型 NVARCHAR(50),
工资 INT
)

INSERT INTO #pay
SELECT '管理部' ,'直接' ,'合同工',1 UNION ALL
SELECT '管理部', '间接', '合同工',2 UNION ALL
SELECT '管理部', '间接', '实习生',4

SELECt * from #pay
DROP TABLE #pay

表中的数据如图:


求助怎么样才能输出如下图的结果(合同类型分类 合同工,劳务工和实习生,输出时需要补全合同类型)
...全文
419 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuxiang_910 2017-09-11
  • 打赏
  • 举报
回复
good job
顺势而为1 2017-06-19
  • 打赏
  • 举报
回复


if object_id('tempdb..#ContractType') is not null
								drop table #ContractType

CREATE TABLE #ContractType
		(
				合同类型 NVARCHAR(50),
		)
Insert into #ContractType
select N'合同工' union
Select N'实习生' union
Select N'劳务工'

if object_id('tempdb..#pay') is not null
								drop table #pay

CREATE TABLE #pay
		(
				管理部 NVARCHAR(50),
				直间接 NVARCHAR(50),
				合同类型 NVARCHAR(50),
				工资 INT
		)

INSERT INTO #pay
SELECT '管理部'	,'直接'	,'合同工',1 UNION ALL
SELECT '管理部',	'间接',	'合同工',2 UNION ALL
SELECT '管理部',	'间接',	'实习生',4

if object_id('tempdb..#Tmp_A') is not null
								drop table #Tmp_A
								
Select *
INTO #Tmp_A
from ( 
			SELECt Distinct 管理部,直间接,b.合同类型,0 as 工资,1 as SortID
			from #pay a  
			join  #ContractType b on 1=1
	  )	a							
	  
UPDATE #Tmp_A
SET 工资=b.工资
From #Tmp_A a
       Join #pay b on a.管理部=b.管理部 and a.直间接=b.直间接 and a.合同类型=b.合同类型

Select 管理部,直间接,合同类型,工资
From (
			Select * From #Tmp_A
			UNION 
			Select 管理部,直间接,'合计',SUM(工资) as 工资,2 as Sort_ID From #Tmp_A Group By 管理部,直间接
			UNION
			Select 管理部,'总计','总计',SUM(工资) as 工资,3 as Sort_ID From #Tmp_A Group By 管理部,合同类型
			union
			Select 管理部,'总计','总计',SUM(工资) as 工资,3 as Sort_ID From #Tmp_A Group By 管理部
		) a
ORDER BY SortID

 


  • 打赏
  • 举报
回复
全部都分成 3类 合同工,劳务工和实习生? 第 3 和 7 的工资 为什么 分别是 0 和4?
zhiaifamily 2017-06-19
  • 打赏
  • 举报
回复
学习学习学习学习学习
中国风 2017-06-19
  • 打赏
  • 举报
回复
公用表T1生成结果集为没有的选项填流0 e.g.

CREATE TABLE #pay
(
管理部 NVARCHAR(50),
直间接 NVARCHAR(50),
合同类型 NVARCHAR(50),
工资 INT
)

INSERT INTO #pay
SELECT '管理部'	,'直接'	,'合同工',1 UNION ALL
SELECT '管理部',	'间接',	'合同工',2 UNION ALL
SELECT '管理部',	'间接',	'实习生',4

;WITH T1
AS
(
SELECT * FROM (SELECT DISTINCT 管理部 FROM #pay) AS a,(SELECT DISTINCT 直间接 FROM #pay) AS b,(SELECT DISTINCT 合同类型 FROM #pay) AS c
),T2
AS
(
SELECT  a.* ,
        ISNULL(b.工资, 0) AS 工资
FROM    T1 AS a
        LEFT JOIN #pay AS b ON b.管理部 = a.管理部
                               AND b.直间接 = a.直间接
                               AND b.合同类型 = a.合同类型
),T3
AS
(
SELECT  T2.管理部 ,
        ISNULL(T2.直间接, '总计') AS 直间接 ,
        CASE WHEN GROUPING(T2.直间接) = 1 THEN '总计'
             WHEN GROUPING(T2.合同类型) = 1 THEN '合计'
             ELSE T2.合同类型
        END AS 合同类型 ,
        SUM(工资) AS 工资,
		CASE WHEN GROUPING(直间接)=1 THEN 3  ELSE 1 END AS Ord1,
		ROW_NUMBER()OVER(ORDER BY T2.管理部) AS Ord2
FROM    T2
GROUP BY T2.管理部 ,
        T2.直间接 ,
        T2.合同类型
        WITH ROLLUP
HAVING  GROUPING(T2.管理部) = 0
UNION ALL
SELECT T2.管理部,'总计',t2.合同类型,SUM(工资) AS 工资,2,ROW_NUMBER()OVER(ORDER BY t2.管理部) AS Ord2 FROM T2 GROUP BY T2.管理部,t2.合同类型
)
SELECT 管理部,直间接,合同类型,工资 FROM T3 ORDER BY Ord1,ord2

DROP TABLE #pay

/*
管理部	直间接	合同类型	工资
管理部	间接	合同工	2
管理部	间接	实习生	4
管理部	间接	合计	6
管理部	直接	合同工	1
管理部	直接	实习生	0
管理部	直接	合计	1
管理部	总计	合同工	3
管理部	总计	实习生	4
管理部	总计	总计	7
*/

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧