求一SQL转换
CREATE TABLE sys_module( module_id int, module_name varchar(20))INSERT INTO sys_module SELECT 1, '公司管理' UNION SELECT 2, '员工管理'CREATE TABLE sys_function( function_id int, function_name varchar(20), module_id int)INSERT INTO sys_function SELECT 1, '添加', 1 UNION SELECT 2, '修改', 1 UNION SELECT 3, '添加', 2 UNION SELECT 4, '修改', 2 UNION SELECT 5, '查看', 2 UNION SELECT 6, '删除', 2/*得到结果:1 公司管理 1 添加 2 修改 2 员工管理 3 添加 4 修改 5 查看 6 删除*/
CREATE TABLE #sys_module( module_id int, module_name varchar(20))INSERT INTO #sys_module SELECT 1, '公司管理' UNION SELECT 2, '员工管理'CREATE TABLE #sys_function( function_id int, function_name varchar(20), module_id int)INSERT INTO #sys_function SELECT 1, '添加', 1 UNION SELECT 2, '修改', 1 UNION SELECT 3, '添加', 2 UNION SELECT 4, '修改', 2 UNION SELECT 5, '查看', 2 UNION SELECT 6, '删除', 2--如果function_name不是很多个的话,可以select a.*,b.function_name,b.function_id into #temp from #sys_module a join #sys_function b on a.module_id=b.module_idselect distinct a.module_id,a.module_name,b.function_id,b.function_name,c.function_id,c.function_name,d.function_id,d.function_name,e.function_id,e.function_namefrom #temp a left join #temp b on a. module_name=b.module_name and a.module_id= b.module_id and b.function_name='添加'left join #temp c on a. module_name=c.module_name and a.module_id= c.module_id and c.function_name='修改'left join #temp d on a. module_name=d.module_name and a.module_id= d.module_id and d.function_name='查看'left join #temp e on a. module_name=e.module_name and a.module_id= e.module_id and e.function_name='删除'/*module_id module_name function_id function_name function_id function_name function_id function_name function_id function_name----------- -------------------- ----------- -------------------- ----------- -------------------- ----------- -------------------- ----------- --------------------1 公司管理 1 添加 2 修改 NULL NULL NULL NULL2 员工管理 3 添加 4 修改 5 查看 6 删除(2 行受影响)*/
[解决办法]
SELECT B.module_id,B.module_name,A.TJ,C.function_name,A.XG,D.function_name,A.CK,E.function_name,A.SC,F.function_nameFROM(SELECT module_id,[添加] AS TJ,[修改] AS XG,[查看] AS CK,[删除] AS SCFROM sys_functionPIVOT(MAX(function_id) FOR function_name IN ([添加],[修改],[查看],[删除])) PIV) AJOIN sys_module B ON A.module_id = B.module_idLEFT JOIN sys_function C ON A.TJ = C.function_id LEFT JOIN sys_function D ON A.XG = D.function_id LEFT JOIN sys_function E ON A.CK = E.function_id LEFT JOIN sys_function F ON A.SC = F.function_id /*module_id module_name TJ function_name XG function_name CK function_name SC function_name----------- -------------------- ----------- -------------------- ----------- -------------------- ----------- -------------------- ----------- --------------------1 公司管理 1 添加 2 修改 NULL NULL NULL NULL2 员工管理 3 添加 4 修改 5 查看 6 删除*/
[解决办法]
declare @sql varchar(max)set @sql = 'select a.module_id,a.module_name'select @sql = @sql + ',max(case b.function_name when '''+function_name+''' then ltrim(b.function_id) else '''' end) ['+function_name+'id]' + ',max(case b.function_name when '''+function_name+''' then b.function_name else '''' end) ['+function_name+']'from sys_functiongroup by function_nameselect @sql = @sql + ' from sys_module a join sys_function b on a.module_id = b.module_id group by a.module_id,a.module_name 'exec(@sql)
[解决办法]
DECLARE @A VARCHAR(5000)SELECT @A = ISNULL(@A+',','')+QUOTENAME(function_name)FROM (SELECT DISTINCT function_name FROM XT_function ) AEXEC('SELECT module_id,'+@A+'FROM (SELECT function_id= CAST(function_id AS VARCHAR(5))+'' ''+function_name,function_name,module_id FROM XT_function) AAPIVOT(MAX(function_id) FOR function_name IN ('+@A+')) PIV')/*module_id 查看 删除 添加 修改----------- --------------------------- --------------------------- --------------------------- ---------------------------1 NULL NULL 1 添加 2 修改2 5 查看 6 删除 3 添加 4 修改--只想到把两列拼一起写*/