繁体   English   中英

使用计数不同时,mssql无效的列名

[英]mssql invalid column name when using count distinct

我很困惑...当我在查询中添加非重复计数和group by语句时,出现一条错误消息,告诉我CallTime和Ticketday是无效的列名。 我如何才能做到这一点而不必先将数据写入表然后进行查询?

select datename(weekday, calllog.RecvdDate) as Ticketday,
CASE WHEN calllog.RecvdTime between '00:00:00' and '01:00:00' THEN '00:00 to 01:00' 
    WHEN calllog.RecvdTime between '01:00:00' and '02:00:00' THEN '01:00 to 02:00' 
    WHEN calllog.RecvdTime between '02:00:00' and '03:00:00' THEN '02:00 to 03:00'
    WHEN calllog.RecvdTime between '03:00:00' and '04:00:00' THEN '03:00 to 04:00'
    WHEN calllog.RecvdTime between '04:00:00' and '05:00:00' THEN '04:00 to 05:00'
    WHEN calllog.RecvdTime between '05:00:00' and '06:00:00' THEN '05:00 to 06:00'
    WHEN calllog.RecvdTime between '06:00:00' and '07:00:00' THEN '06:00 to 07:00'
    WHEN calllog.RecvdTime between '07:00:00' and '08:00:00' THEN '07:00 to 08:00'
    WHEN calllog.RecvdTime between '08:00:00' and '09:00:00' THEN '08:00 to 09:00'
    WHEN calllog.RecvdTime between '09:00:00' and '10:00:00' THEN '09:00 to 10:00'
    WHEN calllog.RecvdTime between '10:00:00' and '11:00:00' THEN '10:00 to 11:00'
    WHEN calllog.RecvdTime between '11:00:00' and '12:00:00' THEN '11:00 to 12:00'
    WHEN calllog.RecvdTime between '12:00:00' and '13:00:00' THEN '12:00 to 13:00'
    WHEN calllog.RecvdTime between '13:00:00' and '14:00:00' THEN '13:00 to 14:00'
    WHEN calllog.RecvdTime between '14:00:00' and '15:00:00' THEN '14:00 to 15:00'
    WHEN calllog.RecvdTime between '15:00:00' and '16:00:00' THEN '15:00 to 16:00'
    WHEN calllog.RecvdTime between '16:00:00' and '17:00:00' THEN '16:00 to 17:00'
    WHEN calllog.RecvdTime between '17:00:00' and '18:00:00' THEN '17:00 to 18:00'
    WHEN calllog.RecvdTime between '18:00:00' and '19:00:00' THEN '18:00 to 19:00'
    WHEN calllog.RecvdTime between '19:00:00' and '20:00:00' THEN '19:00 to 20:00'
    WHEN calllog.RecvdTime between '20:00:00' and '21:00:00' THEN '20:00 to 21:00'
    WHEN calllog.RecvdTime between '21:00:00' and '22:00:00' THEN '21:00 to 22:00'
    WHEN calllog.RecvdTime between '22:00:00' and '23:00:00' THEN '22:00 to 23:00'
    WHEN calllog.RecvdTime between '23:00:00' and '23:59:59' THEN '23:00 to 00:00'
    END as CallTime, count(distinct(CallTime)) as CallCount
from SERVER.xxxx.dbo.view_calllog calllog
where calllog.RecvdDate > '2015-01-01'
and calllog.NameRecvdBy = 'IVR User Account'
and calllog.CallDesc LIKE '%string%'
group by Ticketday, CallTime
order by Ticketday, CallTime

问题是当解析查询时,在尝试在select语句中使用别名CallTime未定义。

一种解决方案是将查询包装在公用表表达式中(或将其用作派生表),如下所示:

;WITH cte (Ticketday, CallTime) AS (
    SELECT 
       DATENAME(weekday, calllog.RecvdDate) AS Ticketday,
       CASE 
          WHEN calllog.RecvdTime BETWEEN '00:00:00' AND '01:00:00' THEN '00:00 to 01:00' 
          WHEN calllog.RecvdTime BETWEEN '01:00:00' AND '02:00:00' THEN '01:00 to 02:00' 
          WHEN calllog.RecvdTime BETWEEN '02:00:00' AND '03:00:00' THEN '02:00 to 03:00'
          WHEN calllog.RecvdTime BETWEEN '03:00:00' AND '04:00:00' THEN '03:00 to 04:00'
          WHEN calllog.RecvdTime BETWEEN '04:00:00' AND '05:00:00' THEN '04:00 to 05:00'
          WHEN calllog.RecvdTime BETWEEN '05:00:00' AND '06:00:00' THEN '05:00 to 06:00'
          WHEN calllog.RecvdTime BETWEEN '06:00:00' AND '07:00:00' THEN '06:00 to 07:00'
          WHEN calllog.RecvdTime BETWEEN '07:00:00' AND '08:00:00' THEN '07:00 to 08:00'
          WHEN calllog.RecvdTime BETWEEN '08:00:00' AND '09:00:00' THEN '08:00 to 09:00'
          WHEN calllog.RecvdTime BETWEEN '09:00:00' AND '10:00:00' THEN '09:00 to 10:00'
          WHEN calllog.RecvdTime BETWEEN '10:00:00' AND '11:00:00' THEN '10:00 to 11:00'
          WHEN calllog.RecvdTime BETWEEN '11:00:00' AND '12:00:00' THEN '11:00 to 12:00'
          WHEN calllog.RecvdTime BETWEEN '12:00:00' AND '13:00:00' THEN '12:00 to 13:00'
          WHEN calllog.RecvdTime BETWEEN '13:00:00' AND '14:00:00' THEN '13:00 to 14:00'
          WHEN calllog.RecvdTime BETWEEN '14:00:00' AND '15:00:00' THEN '14:00 to 15:00'
          WHEN calllog.RecvdTime BETWEEN '15:00:00' AND '16:00:00' THEN '15:00 to 16:00'
          WHEN calllog.RecvdTime BETWEEN '16:00:00' AND '17:00:00' THEN '16:00 to 17:00'
          WHEN calllog.RecvdTime BETWEEN '17:00:00' AND '18:00:00' THEN '17:00 to 18:00'
          WHEN calllog.RecvdTime BETWEEN '18:00:00' AND '19:00:00' THEN '18:00 to 19:00'
          WHEN calllog.RecvdTime BETWEEN '19:00:00' AND '20:00:00' THEN '19:00 to 20:00'
          WHEN calllog.RecvdTime BETWEEN '20:00:00' AND '21:00:00' THEN '20:00 to 21:00'
          WHEN calllog.RecvdTime BETWEEN '21:00:00' AND '22:00:00' THEN '21:00 to 22:00'
          WHEN calllog.RecvdTime BETWEEN '22:00:00' AND '23:00:00' THEN '22:00 to 23:00'
          WHEN calllog.RecvdTime BETWEEN '23:00:00' AND '23:59:59' THEN '23:00 to 00:00'
       END AS CallTime
    FROM SERVER.xxxx.dbo.view_calllog calllog
    WHERE calllog.RecvdDate > '2015-01-01'
    AND calllog.NameRecvdBy = 'IVR User Account'
    AND calllog.CallDesc LIKE '%string%'
)
SELECT Ticketday, COUNT(DISTINCT CallTime) AS CallCount 
FROM cte
GROUP BY Ticketday, CallTime
ORDER BY Ticketday, CallTime

同样, distinct不是函数。 正确的语法是count(distinct CallTime)

您不能将列别名放在分组依据中; 但是,您可以将表达式放在您的分组依据中。 在这种情况下,虽然看起来非常难看。 就像是:

select datename(weekday, calllog.RecvdDate) as Ticketday,
    <<BIG CASE STATEMENT HERE>> as CallTime, 
    count(distinct(CallTime)) as CallCount
from SERVER.xxxx.dbo.view_calllog calllog
where calllog.RecvdDate > '2015-01-01'
    and calllog.NameRecvdBy = 'IVR User Account'
    and calllog.CallDesc LIKE '%string%'
group by datename(weekday, calllog.RecvdDate), <<BIG CASE STATEMENT HERE>>
order by Ticketday, CallTime

另一种方法是使用子查询,因此您不必两次查看该大写语句。 :)

select Ticketday, 
    CallTime, 
    count(distinct(CallTime)) as CallCount
from
    (
    select datename(weekday, calllog.RecvdDate) as Ticketday,
    CASE WHEN calllog.RecvdTime between '00:00:00' and '01:00:00' THEN '00:00 to 01:00' 
        WHEN calllog.RecvdTime between '01:00:00' and '02:00:00' THEN '01:00 to 02:00' 
        WHEN calllog.RecvdTime between '02:00:00' and '03:00:00' THEN '02:00 to 03:00'
        WHEN calllog.RecvdTime between '03:00:00' and '04:00:00' THEN '03:00 to 04:00'
        WHEN calllog.RecvdTime between '04:00:00' and '05:00:00' THEN '04:00 to 05:00'
        WHEN calllog.RecvdTime between '05:00:00' and '06:00:00' THEN '05:00 to 06:00'
        WHEN calllog.RecvdTime between '06:00:00' and '07:00:00' THEN '06:00 to 07:00'
        WHEN calllog.RecvdTime between '07:00:00' and '08:00:00' THEN '07:00 to 08:00'
        WHEN calllog.RecvdTime between '08:00:00' and '09:00:00' THEN '08:00 to 09:00'
        WHEN calllog.RecvdTime between '09:00:00' and '10:00:00' THEN '09:00 to 10:00'
        WHEN calllog.RecvdTime between '10:00:00' and '11:00:00' THEN '10:00 to 11:00'
        WHEN calllog.RecvdTime between '11:00:00' and '12:00:00' THEN '11:00 to 12:00'
        WHEN calllog.RecvdTime between '12:00:00' and '13:00:00' THEN '12:00 to 13:00'
        WHEN calllog.RecvdTime between '13:00:00' and '14:00:00' THEN '13:00 to 14:00'
        WHEN calllog.RecvdTime between '14:00:00' and '15:00:00' THEN '14:00 to 15:00'
        WHEN calllog.RecvdTime between '15:00:00' and '16:00:00' THEN '15:00 to 16:00'
        WHEN calllog.RecvdTime between '16:00:00' and '17:00:00' THEN '16:00 to 17:00'
        WHEN calllog.RecvdTime between '17:00:00' and '18:00:00' THEN '17:00 to 18:00'
        WHEN calllog.RecvdTime between '18:00:00' and '19:00:00' THEN '18:00 to 19:00'
        WHEN calllog.RecvdTime between '19:00:00' and '20:00:00' THEN '19:00 to 20:00'
        WHEN calllog.RecvdTime between '20:00:00' and '21:00:00' THEN '20:00 to 21:00'
        WHEN calllog.RecvdTime between '21:00:00' and '22:00:00' THEN '21:00 to 22:00'
        WHEN calllog.RecvdTime between '22:00:00' and '23:00:00' THEN '22:00 to 23:00'
        WHEN calllog.RecvdTime between '23:00:00' and '23:59:59' THEN '23:00 to 00:00'
        END as CallTime
    from SERVER.xxxx.dbo.view_calllog calllog
    where calllog.RecvdDate > '2015-01-01'
    and calllog.NameRecvdBy = 'IVR User Account'
    and calllog.CallDesc LIKE '%string%'
    ) CallData
group by Ticketday, CallTime
order by Ticketday, CallTime

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM