2017-10-13 2 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'근처에 구문이 잘못되었습니다. –

+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 
관련 문제