Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 避免编写多个union语句_Sql_Tsql_Union - Fatal编程技术网

Sql 避免编写多个union语句

Sql 避免编写多个union语句,sql,tsql,union,Sql,Tsql,Union,我必须抓取一份记录列表,其中显示了过去8周内每种通话类型每周收到的通话总数。有没有更好的方法在MSSQL中编写?我应该查阅哪些术语或参考资料 我想避免在WHERE条款中有不同喜好的多重联合 SELECT 'Agent did not speak to Business Owner' AS QCDescription, CONVERT(float ,SUM(CASE WHEN c.VerifiedDate BETWEEN @LastWeekStart AND @LastWeek

我必须抓取一份记录列表,其中显示了过去8周内每种通话类型每周收到的通话总数。有没有更好的方法在MSSQL中编写?我应该查阅哪些术语或参考资料

我想避免在WHERE条款中有不同喜好的多重联合

SELECT 
    'Agent did not speak to Business Owner' AS QCDescription, 
    CONVERT(float ,SUM(CASE WHEN c.VerifiedDate BETWEEN @LastWeekStart AND @LastWeekEnd   THEN 1 ELSE 0 END)) [LastWeek]
FROM 
    dbo.[Call] c JOIN
    dbo.[User] u on c.UserID = u.UserID
WHERE 
    c.IsPassedQC = 0 
    AND (c.QCDate IS NOT NULL AND c.VerifiedDate > '11/4/2013')
    AND (c.CallCenterID = 0 OR c.CallCenterID = u.CallCenterID)
    AND  c.QCReason LIKE '%Agent did not speak to Business Owner%' --dbo.QCResason.Description 
UNION 
    SELECT 
    'Agent explained Radius' AS QCDescription, 
    CONVERT(float ,SUM(CASE WHEN c.VerifiedDate BETWEEN @LastWeekStart AND @LastWeekEnd   THEN 1 ELSE 0 END)) [LastWeek]
FROM 
    dbo.[Call] c 
    JOIN dbo.[User] u on c.UserID = u.UserID 
WHERE 
    c.IsPassedQC = 0 
    AND (c.QCDate IS NOT NULL AND c.VerifiedDate > '11/4/2013')
    AND (c.CallCenterID = 0 OR c.CallCenterID = u.CallCenterID)
    AND  c.QCReason LIKE '%Agent explained Radius%' --dbo.QCReason.Description


如果可以处理多列而不是多行,则可以使用条件聚合:

SELECT SUM(CASE WHEN c.VerifiedDate BETWEEN @LastWeekStart AND @LastWeekEnd AND
                     c.QCReason LIKE '%Agent did not speak to Business Owner%'
                THEN 1 ELSE 0 END) as DidNotSpeaktoBusinessOwner,
       SUM(CASE WHEN c.VerifiedDate BETWEEN @LastWeekStart AND @LastWeekEnd AND
                     c.QCReason LIKE '%Agent explained Radius%'
                THEN 1 ELSE 0 END) as AgentExplainedRadius  
FROM dbo.[Call] c JOIN
     dbo.[User] u
     on c.UserID = u.UserID
WHERE c.IsPassedQC = 0 AND
      (c.QCDate IS NOT NULL AND c.VerifiedDate > '2013-11-04')
      (c.CallCenterID = 0 OR c.CallCenterID = u.CallCenterID)
编辑:

下面是一种可以在单独的行上获得结果的方法。请注意,这可能不会像前面的查询那样执行:

with patterns as (
      select 'Agent did not speak to Business Owner' as name,
             '%Agent did not speak to Business Owner%' as pattern union all
      select 'Agent explained Radius', '%Agent explained Radius%'
     )
SELECT patterns.name,
       SUM(CASE WHEN c.VerifiedDate BETWEEN @LastWeekStart AND @LastWeekEnd AND
                     c.QCReason LIKE patterns.pattern
                THEN 1 ELSE 0 END)
FROM patterns cross join
     dbo.[Call] c JOIN
     dbo.[User] u
     on c.UserID = u.UserID
WHERE c.IsPassedQC = 0 AND
      (c.QCDate IS NOT NULL AND c.VerifiedDate > '2013-11-04')
      (c.CallCenterID = 0 OR c.CallCenterID = u.CallCenterID)
GROUP BY  patterns.name;

我把它拼凑在一起,没有办法测试它(语法或可行性),但类似的东西可以工作:

SELECT
    case
      when c.QCReason LIKE '%Agent explained Radius%' then 'Agent explained Radius'
      when c.QCReason LIKE '%Agent did not speak to Business Owner%' then 'Agent did not speak to Business Owner'
      else 'xxx'
    end  QCDescription,
    CONVERT(float ,SUM(CASE WHEN c.VerifiedDate BETWEEN @LastWeekStart AND @LastWeekEnd   THEN 1 ELSE 0 END)) [LastWeek]
FROM 
    dbo.[Call] c JOIN
    dbo.[User] u on c.UserID = u.UserID
WHERE 
    c.IsPassedQC = 0 
    AND (c.QCDate IS NOT NULL AND c.VerifiedDate > '11/4/2013')
    AND (c.CallCenterID = 0 OR c.CallCenterID = u.CallCenterID)
GROUP BY
    case
      when c.QCReason LIKE '%Agent explained Radius%' then 'Agent explained Radius'
      when c.QCReason LIKE '%Agent did not speak to Business Owner%' then 'Agent did not speak to Business Owner'
      else 'xxx'
    end
HAVING
    case
      when c.QCReason LIKE '%Agent explained Radius%' then 'Agent explained Radius'
      when c.QCReason LIKE '%Agent did not speak to Business Owner%' then 'Agent did not speak to Business Owner'
      else 'xxx'
    end <> 'xxx'
选择
案例
当c.QCReason如“%Agent explained Radius%”时,则为“Agent explained Radius”
当像“%Agent”这样的c.QCReason未与业务所有者%对话时,则“Agent未与业务所有者对话”
其他'xxx'
结束说明,
转换(float,SUM(当c.VerifiedDate在@LastWeekStart和@LastWeekEnd之间时,则为1,否则为0结束))[LastWeek]
从…起
dbo.[Call]c加入
dbo.UserID=u.UserID上的[User]u
哪里
c、 IsPassedQC=0
和(c.QCDate不为空,c.VerifiedDate>'11/4/2013')
和(c.CallCenterID=0或c.CallCenterID=u.CallCenterID)
分组
案例
当c.QCReason如“%Agent explained Radius%”时,则为“Agent explained Radius”
当像“%Agent”这样的c.QCReason未与业务所有者%对话时,则“Agent未与业务所有者对话”
其他'xxx'
结束
有
案例
当c.QCReason如“%Agent explained Radius%”时,则为“Agent explained Radius”
当像“%Agent”这样的c.QCReason未与业务所有者%对话时,则“Agent未与业务所有者对话”
其他'xxx'
结束“xxx”

having子句使我紧张。如果失败,您需要一个奇特的
where
子句来过滤c.QCReason。另一个问题是,如果没有这样的行,就不会得到0,也不会得到该值对应的行。

这肯定很有用,我看到自己在将来的查询中使用了条件聚合!但是,这个特定的查询必须使用多行而不是多列来编写。
SELECT
    case
      when c.QCReason LIKE '%Agent explained Radius%' then 'Agent explained Radius'
      when c.QCReason LIKE '%Agent did not speak to Business Owner%' then 'Agent did not speak to Business Owner'
      else 'xxx'
    end  QCDescription,
    CONVERT(float ,SUM(CASE WHEN c.VerifiedDate BETWEEN @LastWeekStart AND @LastWeekEnd   THEN 1 ELSE 0 END)) [LastWeek]
FROM 
    dbo.[Call] c JOIN
    dbo.[User] u on c.UserID = u.UserID
WHERE 
    c.IsPassedQC = 0 
    AND (c.QCDate IS NOT NULL AND c.VerifiedDate > '11/4/2013')
    AND (c.CallCenterID = 0 OR c.CallCenterID = u.CallCenterID)
GROUP BY
    case
      when c.QCReason LIKE '%Agent explained Radius%' then 'Agent explained Radius'
      when c.QCReason LIKE '%Agent did not speak to Business Owner%' then 'Agent did not speak to Business Owner'
      else 'xxx'
    end
HAVING
    case
      when c.QCReason LIKE '%Agent explained Radius%' then 'Agent explained Radius'
      when c.QCReason LIKE '%Agent did not speak to Business Owner%' then 'Agent did not speak to Business Owner'
      else 'xxx'
    end <> 'xxx'