2017-10-13 36 views
1

如何根據列創建列。MSSQL:使用計數時根據行創建列

所以排「EOIVR - SB_Internal_LN - 3 - 操作員」,它會創建一個名爲「操作」列和值將是從「選項按」

在這種sql fiddle

的價值下表

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

以及鏈接到小提琴,將小提琴代碼複製到問題,並請添加一些輸出到帖子的描述,我看不出如何結果可能導致您想要的輸出。 – Tanner

+0

在這裏看看https://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query – ventik

回答

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

+0

謝謝,但我得到錯誤,警告: 'COUNT'附近語法不正確。當我在rextester上運行時 –

+0

@ Louis-PhilippeDescamps在'AS [date]'之後缺少逗號。固定。 – lad2025

0

我們需要使用'%%'表達式,它在名稱列中使用時無處不在。因爲如果單詞末尾有空白,它會誤解所需單詞並在分組時給出錯誤結果。

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