【问题标题】:MSSQL: Create column based on row when using countMSSQL:使用计数时基于行创建列
【发布时间】:2017-10-13 13:23:51
【问题描述】:

如何根据列创建列。

所以对于“EOIVR - SB_Internal_LN - 3 - Operator”行,它将创建一个名为“operator”的列,其值将是“option press”中的值

在这个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 上获得了只读权限

【问题讨论】:

  • 以及链接到小提琴,将小提琴代码复制到问题中,并将输出的一些描述添加到帖子中,我看不出该结果如何导致您想要的输出。

标签: sql sql-server tsql sql-server-2014


【解决方案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

【讨论】:

  • 谢谢,但我收到错误、警告:'COUNT' 附近的语法不正确。当我在 rextester 上运行它时
  • @Louis-PhilippeDescamps AS [date] 后缺少逗号。固定。
【解决方案2】:

我们需要使用 '%%' 表达式,当在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 2020-07-28
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    相关资源
    最近更新 更多