如何根据列创建列。
因此对于行" EOIVR - SB_Internal_LN - 3 - 运算符",它会创建一个名为"运算符"的列。并且值将是"选项按"
的值 中下表
CREATE TABLE IVRInterval
([cLevelName] varchar(50), [nLevel] FLOAT(20), [I3TimeStampGMT] DATETIME, [cExitPath] varchar(20))
;
INSERT INTO IVRInterval
([cLevelName], [nLevel], [I3TimeStampGMT], [cExitPath])
VALUES
('EOIVR - SB_Internal_LN - 3 - Operator', '5', '2017-10-05 09:30:00.000', 'Workgroup Queue'),
('EOIVR - SB_Internal_LN - 3 - Operator', '5', '2017-10-05 10:00:00.000', 'Workgroup Queue'),
('EOIVR - SB_Internal_LN - 3 - Operator', '5', '2017-10-11 11:30:00.000', 'Workgroup Queue'),
('EOIVR - SB_Internal_LN - 3 - Operator', '5', '2017-10-11 12:30:00.000', 'Workgroup Queue'),
('EOIVR - SB_Internal_LN - 1 - SD', '5', '2017-10-11 13:30:00.000', 'Workgroup Queue'),
('EOIVR - SB_Internal_LN - 1 - SD', '5', '2017-10-09 08:30:00.000', 'Workgroup Queue'),
('EOIVR - SB_Internal_LN - 1 - SD', '5', '2017-10-09 11:00:00.000', '*'),
('EOIVR - SB_Internal_LN - 1 - SD', '5', '2017-10-11 15:00:00.000', 'Workgroup Queue'),
('EOIVR - SB_Internal_LN - 1 - SD', '5', '2017-10-06 09:30:00.000', 'Workgroup Queue'),
('EOIVR - SB_Internal_LN - 1 - SD', '5', '2017-10-06 11:30:00.000', 'Workgroup Queue'),
('EOIVR - SB_Internal_LN - 1 - SD', '5', '2017-10-09 14:30:00.000', '*'),
('EOIVR - SB_Internal_LN - 2 - Lobby', '5', '2017-10-06 13:30:00.000', 'Workgroup Queue'),
('EOIVR - SB_Internal_LN - 2 - Lobby', '5', '2017-10-09 14:00:00.000', 'Workgroup Queue'),
('EOIVR - SB_Internal_LN - 2 - Lobby', '5', '2017-10-04 07:30:00.000', 'Workgroup Queue'),
('EOIVR - SB_Internal_LN - 2 - Lobby', '5', '2017-10-04 08:30:00.000', 'Workgroup Queue'),
('EOIVR - SB_Internal_LN - 2 - Lobby', '5', '2017-10-10 08:00:00.000', '*')
我运行此查询
select
Convert(date,I3TimeStampGMT) as 'Dates',
(select cLevelName) as 'Options Name',
count(I3TimeStampGMT) as 'Option Press'
from IVRInterval
where
I3TimeStampGMT between '2017-10-04 00:00:00' and '2017-10-11 23:59:59'
and cLevelName like '%%EOIVR - SB_Internal_LN -%%'
and nLevel = '5'
and not cExitPath = '*'
group by cLevelName, Convert(date,I3TimeStampGMT)
我得到了这个结果
Dates Options Name Option Press
2017-10-04 EOIVR - SB_Internal_LN - 2 - Lobby 2
2017-10-05 EOIVR - SB_Internal_LN - 3 - Operator 2
2017-10-06 EOIVR - SB_Internal_LN - 1 - SD 2
2017-10-06 EOIVR - SB_Internal_LN - 2 - Lobby 1
2017-10-09 EOIVR - SB_Internal_LN - 1 - SD 1
2017-10-09 EOIVR - SB_Internal_LN - 2 - Lobby 1
2017-10-11 EOIVR - SB_Internal_LN - 1 - SD 2
2017-10-11 EOIVR - SB_Internal_LN - 3 - Operator 2
我希望得到这样的结果
Date Lobby SD Operator
2017-10-11 0 1 1
我在mssql上只读了
答案 0 :(得分:1)
您可以使用条件聚合:
SELECT CAST([I3TimeStampGMT] AS DATE) AS [date],
COUNT(CASE WHEN [cLevelName] LIKE '%Lobby' THEN 1 END) AS Lobby,
COUNT(CASE WHEN [cLevelName] LIKE '%SD' THEN 1 END) AS SD,
COUNT(CASE WHEN [cLevelName] LIKE '%Operator' THEN 1 END) AS Operator
FROM IVRInterval
GROUP BY CAST([I3TimeStampGMT] AS DATE);
<强> Rextester Demo 强>
答案 1 :(得分:0)
我们需要使用'%%'表达式,这在name列中使用like时无处不在。因为如果在单词的末尾有一个间隙,它会误解所需的单词并在分组时给出错误的结果。
create table stack(Dates date,name nvarchar(100))
insert into stack values
('2017-10-04', 'EOIVR - SB_Internal_LN - 2 - Lobby ') ,
('2017-10-05', 'EOIVR - SB_Internal_LN - 3 - Operator') ,
('2017-10-06', 'EOIVR - SB_Internal_LN - 1 - SD') ,
('2017-10-06', 'EOIVR - SB_Internal_LN - 2 - Lobby') ,
('2017-10-09', 'EOIVR - SB_Internal_LN - 1 - SD') ,
('2017-10-09', 'EOIVR - SB_Internal_LN - 2 - Lobby') ,
('2017-10-11', 'EOIVR - SB_Internal_LN - 1 - SD') ,
('2017-10-11', 'EOIVR - SB_Internal_LN - 3 - Operator')
SELECT Dates as Date,
COUNT(CASE WHEN name LIKE '%Lobby%' THEN 1 END) AS Lobby,
COUNT(CASE WHEN name LIKE '%SD%' THEN 1 END) AS SD,
COUNT(CASE WHEN name LIKE '%Operator%' THEN 1 END) AS Operator
FROM stack
GROUP BY Dates