列换成行显示~~~

时间:2021-07-15 10:28:27
ID ModuleID  WhereFieldName  WhereFieldValue  ShowMsg
1  100       bCheck          0                共有 1 条未审核单据 
2  100       bCheck          1                共有 3 条已审核单据  
3  100       WriteTime                        共有 1 条今天新增单据
4  101       bCheck          0                共有 9 条未审核单据 
5  101       bCheck          1                共有 5 条已审核单据         



我要显示成这个样子:

ModuleID  ShowMsg1               ShowMsg2                ShowMsg3
100       共有 1 条未审核单据    共有 3 条已审核单据     共有 1 条今天新增单据
101       共有 9 条未审核单据    共有 5 条已审核单据

6 个解决方案

#1


select ModuleID , 
       max(case when WhereFieldName = 'bCheck' and WhereFieldValue = 0 then ShowMsg else '' end) as ShowMsg1,
       max(case when WhereFieldName = 'bCheck' and WhereFieldValue = 1 then ShowMsg else '' end) as ShowMsg2,
       max(case when WhereFieldName = 'WriteTime' then ShowMsg else '' end) as ShowMsg3
from tb
group by ModuleID

#2


..
固化了

能不能根据WhereFieldName的不同和WhereFieldValue的不同  自动增加列数?

就象上面的数据:
bCheck0 bCheck1 WriteTime  (列名无所谓,只要能根据不同的WhereFieldName和WhereFieldValue)自动增加就行
...     ...     ...
...     ...     ...

#3


ModuleID  bCheck等于0的时候      bCheck等于1的时候       WriteTime为NULL的时候
100       共有 1 条未审核单据    共有 3 条已审核单据     共有 1 条今天新增单据
101       共有 9 条未审核单据    共有 5 条已审核单据

#4


Mark

#5


create table T(ID int, ModuleID int, WhereFieldName nvarchar(10), WhereFieldValue int, ShowMsg nvarchar(50))
insert T select 1,  100,       'bCheck',          0,                '共有 1 条未审核单据' 
union all select 2,  100,       'bCheck',          1,                '共有 3 条已审核单据'  
union all select 3,  100,       'WriteTime',       NULL,                 '共有 1 条今天新增单据'
union all select 4,  101,       'bCheck',          0,                '共有 9 条未审核单据' 
union all select 5,  101,       'bCheck',          1,                '共有 5 条已审核单据'  



declare @sql nvarchar(4000)
set @sql='select ModuleID,'
select @sql=@sql+WhereFieldName+'等于'+case when WhereFieldValue is null then 'NULL' else rtrim(WhereFieldValue) end+'的时候=
max(case when isnull(WhereFieldName, '''')='+quotename(isnull(WhereFieldName, ''), '''') +' and isnull(WhereFieldValue, '''')='+
quotename(isnull(WhereFieldValue, ''), '''')+' then ShowMsg end),' 
from T 
group by WhereFieldName, WhereFieldValue
select @sql=left(@sql, len(@sql)-1), @sql=@sql+' from T group by ModuleID '
exec(@sql)

--result
ModuleID    bCheck等于0的时候                                       bCheck等于1的时候                                       WriteTime等于NULL的时候                                 
----------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- 
100         共有 1 条未审核单据                                        共有 3 条已审核单据                                        共有 1 条今天新增单据
101         共有 9 条未审核单据                                        共有 5 条已审核单据                                        NULL

#6


OK TKS~

#1


select ModuleID , 
       max(case when WhereFieldName = 'bCheck' and WhereFieldValue = 0 then ShowMsg else '' end) as ShowMsg1,
       max(case when WhereFieldName = 'bCheck' and WhereFieldValue = 1 then ShowMsg else '' end) as ShowMsg2,
       max(case when WhereFieldName = 'WriteTime' then ShowMsg else '' end) as ShowMsg3
from tb
group by ModuleID

#2


..
固化了

能不能根据WhereFieldName的不同和WhereFieldValue的不同  自动增加列数?

就象上面的数据:
bCheck0 bCheck1 WriteTime  (列名无所谓,只要能根据不同的WhereFieldName和WhereFieldValue)自动增加就行
...     ...     ...
...     ...     ...

#3


ModuleID  bCheck等于0的时候      bCheck等于1的时候       WriteTime为NULL的时候
100       共有 1 条未审核单据    共有 3 条已审核单据     共有 1 条今天新增单据
101       共有 9 条未审核单据    共有 5 条已审核单据

#4


Mark

#5


create table T(ID int, ModuleID int, WhereFieldName nvarchar(10), WhereFieldValue int, ShowMsg nvarchar(50))
insert T select 1,  100,       'bCheck',          0,                '共有 1 条未审核单据' 
union all select 2,  100,       'bCheck',          1,                '共有 3 条已审核单据'  
union all select 3,  100,       'WriteTime',       NULL,                 '共有 1 条今天新增单据'
union all select 4,  101,       'bCheck',          0,                '共有 9 条未审核单据' 
union all select 5,  101,       'bCheck',          1,                '共有 5 条已审核单据'  



declare @sql nvarchar(4000)
set @sql='select ModuleID,'
select @sql=@sql+WhereFieldName+'等于'+case when WhereFieldValue is null then 'NULL' else rtrim(WhereFieldValue) end+'的时候=
max(case when isnull(WhereFieldName, '''')='+quotename(isnull(WhereFieldName, ''), '''') +' and isnull(WhereFieldValue, '''')='+
quotename(isnull(WhereFieldValue, ''), '''')+' then ShowMsg end),' 
from T 
group by WhereFieldName, WhereFieldValue
select @sql=left(@sql, len(@sql)-1), @sql=@sql+' from T group by ModuleID '
exec(@sql)

--result
ModuleID    bCheck等于0的时候                                       bCheck等于1的时候                                       WriteTime等于NULL的时候                                 
----------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- 
100         共有 1 条未审核单据                                        共有 3 条已审核单据                                        共有 1 条今天新增单据
101         共有 9 条未审核单据                                        共有 5 条已审核单据                                        NULL

#6


OK TKS~