Sql 避免编写多个union语句
我必须抓取一份记录列表,其中显示了过去8周内每种通话类型每周收到的通话总数。有没有更好的方法在MSSQL中编写?我应该查阅哪些术语或参考资料 我想避免在WHERE条款中有不同喜好的多重联合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
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'