34,590
社区成员
发帖
与我相关
我的任务
分享
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
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
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
*/