22,207
社区成员
发帖
与我相关
我的任务
分享
DECLARE @Sql NVARCHAR(max)=''
--不确定项目名称时要分拆项目
SELECT
@Sql+=','+'SUM(SIGN(CHARINDEX('','+ItemName+','','',''+项目+'',''))) AS '+QUOTENAME(ItemName)
FROM (SELECT DISTINCT SUBSTRING(a.项目,b.number,CHARINDEX(',',a.项目+',',b.number)-b.number) AS ItemName
FROM #1 AS a
, master.dbo.spt_values AS b
WHERE b.type='P' AND CHARINDEX(',',','+a.项目,b.number)=b.number)AS t
WHERE ItemName>''
;
EXEC ('SELECT [日期],[小组]'+@Sql+' FROM #1 GROUP BY [日期],[小组]')
CREATE VIEW v1
AS
SELECT [日期]
, [小组]
, SUM(SIGN(CHARINDEX(',吃,', ','+项目+','))) AS [吃]
, SUM(SIGN(CHARINDEX(',喝,', ','+项目+','))) AS [喝]
, SUM(SIGN(CHARINDEX(',乐,', ','+项目+','))) AS [乐]
, SUM(SIGN(CHARINDEX(',玩,', ','+项目+','))) AS [玩]
FROM #1
GROUP BY [日期]
, [小组];
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
if not object_id(N'Tempdb..#1') is null
drop table #1
Go
Create table #1([日期] Date,[小组] nvarchar(21),[项目] nvarchar(25))
Insert #1
select '2010/1/1',N'赵',N'吃,喝' union all
select '2010/1/1',N'钱',N'玩' union all
select '2010/1/1',N'孙',N'吃' union all
select '2010/1/2',N'李',N'喝,乐' union all
select '2010/1/3',N'王',N'吃,乐' union all
select '2010/1/3',N'赵',N'玩' union all
select '2010/1/3',N'王',N'乐,玩' union all
select '2010/1/4',N'李',N'吃,喝,玩' union all
select '2010/1/4',N'王',N'乐' union all
select '2010/1/4',N'赵',N'吃' union all
select '2010/1/4',N'王',N'喝,乐' union all
select '2010/1/4',N'李',N'玩'
GO
DECLARE @Sql NVARCHAR(max)=''
--不确定项目名称时要分拆项目
SELECT
@Sql+=','+'SUM(SIGN(CHARINDEX('','+ItemName+','','',''+项目+'',''))) AS '+QUOTENAME(ItemName)
FROM (SELECT DISTINCT SUBSTRING(a.项目,b.number,CHARINDEX(',',a.项目+',',b.number)-b.number) AS ItemName
FROM #1 AS a
, master.dbo.spt_values AS b
WHERE b.type='P' AND CHARINDEX(',',','+a.项目,b.number)=b.number )AS t
;
EXEC ('SELECT [日期],[小组]'+@Sql+' FROM #1 GROUP BY [日期],[小组]')
/*
日期 小组 吃 喝 乐 玩
2010-01-02 李 0 1 1 0
2010-01-04 李 1 1 0 2
2010-01-01 钱 0 0 0 1
2010-01-01 孙 1 0 0 0
2010-01-03 王 1 0 2 1
2010-01-04 王 0 1 2 0
2010-01-01 赵 1 1 0 0
2010-01-03 赵 0 0 0 1
2010-01-04 赵 1 0 0 0
*/
if object_id(N'Tempdb.DBO.#T1') is not null
drop table #T1
Go
Create table #T1([RQ] nvarchar(23),[XM] nvarchar(23),XMMC VARCHAR(200))
Insert INTO #T1
SELECT '2010/1/1','赵','吃,喝' UNION ALL
SELECT '2010/1/1','钱','玩' UNION ALL
SELECT '2010/1/1','孙','吃' UNION ALL
SELECT '2010/1/2','李','喝,乐' UNION ALL
SELECT '2010/1/3','王','吃,乐' UNION ALL
SELECT '2010/1/3','赵','玩' UNION ALL
SELECT'2010/1/3','王 ','乐,玩'UNION ALL
SELECT '2010/1/4','李','吃,喝,玩'UNION ALL
SELECT '2010/1/4','王','乐' UNION ALL
SELECT '2010/1/4','赵','吃' UNION ALL
SELECT '2010/1/4','王','喝,乐' UNION ALL
SELECT '2010/1/4','李','玩'
--SELECT * FROM #T1
DECLARE @COL1 VARCHAR(290),@sql1 NVARCHAR(max)
select @COL1=ISNULL(@COL1+','+CHAR(32)+'[','[')+CAST(VAL AS VARCHAR)+']' FROM (
SELECT DISTINCT VAL FROM (SELECT * FROM #T1 A CROSS APPLY PX_ALL.DBO.Func_SplitStr(XMMC,',')B) A) C1
PRINT @COL1
--SELECT * FROM (SELECT A.RQ,A.XM,B.VAL FROM #T1 A CROSS APPLY PX_ALL.DBO.Func_SplitStr(XMMC,',')B) M1
SET @sql1 =
'SELECT * FROM (SELECT A.RQ,A.XM,B.VAL FROM #T1 A CROSS APPLY PX_ALL.DBO.Func_SplitStr(XMMC,'','')B) M1
PIVOT (COUNT(VAL)FOR VAL IN( '+ @COL1 +' )) AS M2'
PRINT @sql1
EXEC sp_executesql @sql1;
/*
RQ XM 吃 乐 喝 玩
2010/1/2 李 0 1 1 0
2010/1/4 李 1 0 1 2
2010/1/1 钱 0 0 0 1
2010/1/1 孙 1 0 0 0
2010/1/3 王 1 1 0 0
2010/1/4 王 0 2 1 0
2010/1/3 王 0 1 0 1
2010/1/1 赵 1 0 1 0
2010/1/3 赵 0 0 0 1
2010/1/4 赵 1 0 0 0
*/
select 日期,小组,
sum(case when 项目like '%喝%' then 1 else 0 end) "喝",
sum(case when 项目like '%玩%' then 1 else 0 end) "玩",
sum(case when 项目like '%乐%' then 1 else 0 end) "乐",
sum(case when 项目like '%乐%' then 1 else 0 end) "吃"
from table group by 日期,小组