SQL中的复杂数据透视表 [英] Complex Pivot table in sql

查看:182
本文介绍了SQL中的复杂数据透视表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,

我在使用存储过程的sql中有一个非常复杂的要求,我有三个表,分别是-zone_master,complaint_master,status_master.

zone_master具有区域名称及其ID:

Hi everyone,

I have one very complex requirement in sql using storedprocedures, i have three tables namely -zone_master,complaint_master,status_master.

zone_master has names of zone and its id :

zoneid	zonename
1	North
2	South
3	West
4	East


status_master中有投诉状态


status_master has complaint status in it

statusid	statusname
1	pending
2	closed
3	noreply
4	partly closed


投诉主控中有投诉


complaint_master has complaints in it

complaintid	complaintnumber	complaintstatusid	zoneid
1	mx/hw/123	1	1
2	mx/sw/234	2	2
3	mx/sw/235	3	3
4	mx/sw/236	4	4


现在我需要使用存储过程在sql中作为非常复杂的数据透视表输出...

输出应为:


now what i need in output as a very complex pivot table in sql using stored procedures...

output should be :

Zone	PendingCount	ClosedCount	NoreplyCount	PartlyClosedCound	GrandTotal
North	1	1	1	1	4
south	1	1	1	1	4
west	1	1	1	1	4
east	1	1	1	1	4



请帮助我.....

谢谢&问候,
克鲁纳尔·潘查尔


已添加代码标签-LOSMAC [/EDIT]



Please help me how it is possible .....

Thanks & Regards,
Krunal Panchal


Code tags added - LOSMAC[/EDIT]

推荐答案

检查此内容:
Check this:
--if temporary tables exists, drop tables
IF NOT OBJECT_ID('#zone_master','U') IS NULL
	DROP TABLE #zone_master
IF NOT OBJECT_ID('#status_master','U') IS NULL
	DROP TABLE #status_master
IF NOT OBJECT_ID('#complaint_master','U') IS NULL
	DROP TABLE #complaint_master

--create temporary tables and insert values
CREATE TABLE #zone_master(zoneid INT, zonename VARCHAR(30))
INSERT INTO #zone_master(zoneid, zonename)
	VALUES(1, 'North')
INSERT INTO #zone_master(zoneid, zonename)
	VALUES(2, 'South')
INSERT INTO #zone_master(zoneid, zonename)
	VALUES(3, 'West')
INSERT INTO #zone_master(zoneid, zonename)
	VALUES(4, 'East')

CREATE TABLE #status_master (statusid INT,  statusname VARCHAR(30))
INSERT INTO #status_master (statusid, statusname)
	VALUES(1, 'pending')
INSERT INTO #status_master (statusid, statusname)
	VALUES(2, 'closed')
INSERT INTO #status_master (statusid, statusname)
	VALUES(3, 'noreply')
INSERT INTO #status_master (statusid, statusname)
	VALUES(4, 'partly closed')

CREATE TABLE #complaint_master(complaintid	INT, complaintnumber VARCHAR(30), complaintstatusid INT, zoneid INT)
INSERT INTO #complaint_master(complaintid, complaintnumber, complaintstatusid, zoneid)
	VALUES(1, 'mx/hw/123', 1,	1)
INSERT INTO #complaint_master(complaintid, complaintnumber, complaintstatusid, zoneid)
	VALUES(2, 'mx/sw/234', 2,	2)
INSERT INTO #complaint_master(complaintid, complaintnumber, complaintstatusid, zoneid)
	VALUES(3, 'mx/sw/235', 3,	3)
INSERT INTO #complaint_master(complaintid, complaintnumber, complaintstatusid, zoneid)
	VALUES(4, 'mx/sw/236', 4,	4)

--declare variables
DECLARE @cols VARCHAR(200)
DECLARE @cols1 VARCHAR(200)
DECLARE @dt VARCHAR(1000)
DECLARE @pt VARCHAR(2000)
DECLARE @fq VARCHAR(4000)

--set variables
--cols -> get all statusname separated by " , "
SET @cols = STUFF((SELECT '],[' + [statusname]
					FROM #status_master
					ORDER BY '],[' + CONVERT(VARCHAR(5),[statusid])
			FOR XML PATH('')),1,2,'') + ']'
--cols1 -> get all statusname separated by " + "
SET @cols1 = STUFF((SELECT '] + [' + [statusname]
					FROM #status_master
					ORDER BY '] + [' + CONVERT(VARCHAR(5),[statusid])
			FOR XML PATH('')),1,2,'') + ']'
--get non-pivoted data
SET @dt = 'SELECT  zm.zonename, sm.statusname ' +
			'FROM #complaint_master AS cm ' +
				'LEFT JOIN #zone_master AS zm ON cm.zoneid = zm.zoneid ' +
				'LEFT JOIN #status_master AS sm ON cm.complaintstatusid = sm.statusid '
--EXEC(@dt)

--get pivoted data
SET @pt = 'SELECT zonename, ' + @cols + ' ' +
			'FROM(' + @dt + ') AS DT ' + 
			'PIVOT (COUNT(statusname) FOR statusname IN(' + @cols + ')) AS PT ' 
--EXEC(@pt)

--remove " + "
SET @cols1 = SUBSTRING(@cols1,3,LEN(@cols1)-2)

--get pivoted data with grand total
SET @fq = 'SELECT zonename, ' + @cols + ', (' + @cols1 +') AS GrandTotal ' +
	'FROM (' + @pt + ') AS FQ'
EXEC (@fq)

--remove temporary tables
DROP TABLE #complaint_master
DROP TABLE #zone_master
DROP TABLE #status_master


这篇关于SQL中的复杂数据透视表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆