联合和聚合函数
Union and Aggregate Functions
我有两个查询要结合 UNION 操作:
DECLARE @BeginningOfYear AS date
SET @BeginningOfYear = smalldatetimefromparts(YEAR(GETDATE()), 1, 1, 0, 0)
SELECT
groupname,
SUM(CASE WHEN ticketcreateddate > DATEADD(DAY, -7, GETDATE()) THEN 1 ELSE 0 END) AS 'LW',
SUM(CASE WHEN ticketcreateddate > @BeginningOfYear THEN 1 ELSE 0 END) AS 'YTD',
CAST(COUNT(*) / DATEDIFF(WEEK, @BeginningOfYear, GETDATE()) AS float) AS 'Average Per Week'
FROM zendeskticketexport
WHERE groupname IN ('DC Web Ops', 'DC Maintenance', 'DC QC1')
GROUP BY groupname
UNION
SELECT
groupname,
SUM(CASE WHEN ticketcreateddate > DATEADD(DAY, -7, GETDATE()) THEN 1 ELSE 0 END) AS 'LW',
SUM(CASE WHEN ticketcreateddate > @BeginningOfYear THEN 1 ELSE 0 END) AS 'YTD',
CAST(COUNT(*) / DATEDIFF(WEEK, @BeginningOfYear, GETDATE()) AS float) AS 'Average Per Week'
FROM zendeskunclosedticketexport
WHERE groupname IN ('DC Web Ops', 'DC Maintenance', 'DC QC1')
GROUP BY groupname
本次查询的结果:
groupname LW YTD Average Per Week
DC Maintenance 179 1831 184
DC QC1 85 647 64
DC Web Ops 69 400 40
DC Maintenance 68 86 8
DC QC1 18 20 2
DC Web Ops 53 80 8
我想总结结果查询中每个组的数字,但我不知道如何在不创建临时表的情况下做到这一点 table...我想避免这样做是因为我觉得这会使查询变得不必要的复杂化。我正在考虑做而不是做一个完整的加入......这会更合适还是临时 table 继续这个的方式?
编辑:我应该提到在 table 上都有一个唯一标识符 - 我们称之为 ID - 但如果一个 ID 存在于 table 上,则它不存在于 table 上其他 - 这就是为什么我认为 FULL join 可能是合适的原因。
我没听错吗,您想要两个表的总和和计数?
SELECT
groupname,
SUM(CASE WHEN ticketcreateddate > DATEADD(DAY, -7, GETDATE()) THEN 1 ELSE 0 END) AS 'LW',
SUM(CASE WHEN ticketcreateddate > @BeginningOfYear THEN 1 ELSE 0 END) AS 'YTD',
CAST(COUNT(*) / DATEDIFF(WEEK, @BeginningOfYear, GETDATE()) AS float) AS 'Average Per Week'
(
SELECT groupname, ticketcreateddate
FROM zendeskunclosedticketexport
WHERE groupname IN ('DC Web Ops', 'DC Maintenance', 'DC QC1')
UNION ALL
SELECT groupname, ticketcreateddate
FROM zendeskunclosedticketexport
WHERE groupname IN ('DC Web Ops', 'DC Maintenance', 'DC QC1')
)
GROUP BY groupname
你可以像这样使用派生 table
select p.groupname,sum(p.LW) as LW,sum(p.YTD) as YTD,sum(p.[Average Per Week]) as Average Per Week from
(SELECT
groupname,
SUM(CASE WHEN ticketcreateddate > DATEADD(DAY, -7, GETDATE()) THEN 1 ELSE 0 END) AS 'LW',
SUM(CASE WHEN ticketcreateddate > @BeginningOfYear THEN 1 ELSE 0 END) AS 'YTD',
CAST(COUNT(*) / DATEDIFF(WEEK, @BeginningOfYear, GETDATE()) AS float) AS 'Average Per Week'
FROM zendeskticketexport
WHERE groupname IN ('DC Web Ops', 'DC Maintenance', 'DC QC1')
GROUP BY groupname
UNION
SELECT
groupname,
SUM(CASE WHEN ticketcreateddate > DATEADD(DAY, -7, GETDATE()) THEN 1 ELSE 0 END) AS 'LW',
SUM(CASE WHEN ticketcreateddate > @BeginningOfYear THEN 1 ELSE 0 END) AS 'YTD',
CAST(COUNT(*) / DATEDIFF(WEEK, @BeginningOfYear, GETDATE()) AS float) AS 'Average Per Week'
FROM zendeskunclosedticketexport
WHERE groupname IN ('DC Web Ops', 'DC Maintenance', 'DC QC1')
GROUP BY groupname) as p
group by p.groupname
或者您可以使用 CTE
;with cte
(SELECT
groupname,
SUM(CASE WHEN ticketcreateddate > DATEADD(DAY, -7, GETDATE()) THEN 1 ELSE 0 END) AS 'LW',
SUM(CASE WHEN ticketcreateddate > @BeginningOfYear THEN 1 ELSE 0 END) AS 'YTD',
CAST(COUNT(*) / DATEDIFF(WEEK, @BeginningOfYear, GETDATE()) AS float) AS 'Average Per Week'
FROM zendeskticketexport
WHERE groupname IN ('DC Web Ops', 'DC Maintenance', 'DC QC1')
GROUP BY groupname
UNION
SELECT
groupname,
SUM(CASE WHEN ticketcreateddate > DATEADD(DAY, -7, GETDATE()) THEN 1 ELSE 0 END) AS 'LW',
SUM(CASE WHEN ticketcreateddate > @BeginningOfYear THEN 1 ELSE 0 END) AS 'YTD',
CAST(COUNT(*) / DATEDIFF(WEEK, @BeginningOfYear, GETDATE()) AS float) AS 'Average Per Week'
FROM zendeskunclosedticketexport
WHERE groupname IN ('DC Web Ops', 'DC Maintenance', 'DC QC1')
GROUP BY groupname)
select p.groupname,sum(p.LW) as LW,sum(p.YTD) as YTD,sum(p.[Average Per Week]) as Average Per Week
from from cte GROUP BY groupname
我有两个查询要结合 UNION 操作:
DECLARE @BeginningOfYear AS date
SET @BeginningOfYear = smalldatetimefromparts(YEAR(GETDATE()), 1, 1, 0, 0)
SELECT
groupname,
SUM(CASE WHEN ticketcreateddate > DATEADD(DAY, -7, GETDATE()) THEN 1 ELSE 0 END) AS 'LW',
SUM(CASE WHEN ticketcreateddate > @BeginningOfYear THEN 1 ELSE 0 END) AS 'YTD',
CAST(COUNT(*) / DATEDIFF(WEEK, @BeginningOfYear, GETDATE()) AS float) AS 'Average Per Week'
FROM zendeskticketexport
WHERE groupname IN ('DC Web Ops', 'DC Maintenance', 'DC QC1')
GROUP BY groupname
UNION
SELECT
groupname,
SUM(CASE WHEN ticketcreateddate > DATEADD(DAY, -7, GETDATE()) THEN 1 ELSE 0 END) AS 'LW',
SUM(CASE WHEN ticketcreateddate > @BeginningOfYear THEN 1 ELSE 0 END) AS 'YTD',
CAST(COUNT(*) / DATEDIFF(WEEK, @BeginningOfYear, GETDATE()) AS float) AS 'Average Per Week'
FROM zendeskunclosedticketexport
WHERE groupname IN ('DC Web Ops', 'DC Maintenance', 'DC QC1')
GROUP BY groupname
本次查询的结果:
groupname LW YTD Average Per Week
DC Maintenance 179 1831 184
DC QC1 85 647 64
DC Web Ops 69 400 40
DC Maintenance 68 86 8
DC QC1 18 20 2
DC Web Ops 53 80 8
我想总结结果查询中每个组的数字,但我不知道如何在不创建临时表的情况下做到这一点 table...我想避免这样做是因为我觉得这会使查询变得不必要的复杂化。我正在考虑做而不是做一个完整的加入......这会更合适还是临时 table 继续这个的方式?
编辑:我应该提到在 table 上都有一个唯一标识符 - 我们称之为 ID - 但如果一个 ID 存在于 table 上,则它不存在于 table 上其他 - 这就是为什么我认为 FULL join 可能是合适的原因。
我没听错吗,您想要两个表的总和和计数?
SELECT
groupname,
SUM(CASE WHEN ticketcreateddate > DATEADD(DAY, -7, GETDATE()) THEN 1 ELSE 0 END) AS 'LW',
SUM(CASE WHEN ticketcreateddate > @BeginningOfYear THEN 1 ELSE 0 END) AS 'YTD',
CAST(COUNT(*) / DATEDIFF(WEEK, @BeginningOfYear, GETDATE()) AS float) AS 'Average Per Week'
(
SELECT groupname, ticketcreateddate
FROM zendeskunclosedticketexport
WHERE groupname IN ('DC Web Ops', 'DC Maintenance', 'DC QC1')
UNION ALL
SELECT groupname, ticketcreateddate
FROM zendeskunclosedticketexport
WHERE groupname IN ('DC Web Ops', 'DC Maintenance', 'DC QC1')
)
GROUP BY groupname
你可以像这样使用派生 table
select p.groupname,sum(p.LW) as LW,sum(p.YTD) as YTD,sum(p.[Average Per Week]) as Average Per Week from
(SELECT
groupname,
SUM(CASE WHEN ticketcreateddate > DATEADD(DAY, -7, GETDATE()) THEN 1 ELSE 0 END) AS 'LW',
SUM(CASE WHEN ticketcreateddate > @BeginningOfYear THEN 1 ELSE 0 END) AS 'YTD',
CAST(COUNT(*) / DATEDIFF(WEEK, @BeginningOfYear, GETDATE()) AS float) AS 'Average Per Week'
FROM zendeskticketexport
WHERE groupname IN ('DC Web Ops', 'DC Maintenance', 'DC QC1')
GROUP BY groupname
UNION
SELECT
groupname,
SUM(CASE WHEN ticketcreateddate > DATEADD(DAY, -7, GETDATE()) THEN 1 ELSE 0 END) AS 'LW',
SUM(CASE WHEN ticketcreateddate > @BeginningOfYear THEN 1 ELSE 0 END) AS 'YTD',
CAST(COUNT(*) / DATEDIFF(WEEK, @BeginningOfYear, GETDATE()) AS float) AS 'Average Per Week'
FROM zendeskunclosedticketexport
WHERE groupname IN ('DC Web Ops', 'DC Maintenance', 'DC QC1')
GROUP BY groupname) as p
group by p.groupname
或者您可以使用 CTE
;with cte
(SELECT
groupname,
SUM(CASE WHEN ticketcreateddate > DATEADD(DAY, -7, GETDATE()) THEN 1 ELSE 0 END) AS 'LW',
SUM(CASE WHEN ticketcreateddate > @BeginningOfYear THEN 1 ELSE 0 END) AS 'YTD',
CAST(COUNT(*) / DATEDIFF(WEEK, @BeginningOfYear, GETDATE()) AS float) AS 'Average Per Week'
FROM zendeskticketexport
WHERE groupname IN ('DC Web Ops', 'DC Maintenance', 'DC QC1')
GROUP BY groupname
UNION
SELECT
groupname,
SUM(CASE WHEN ticketcreateddate > DATEADD(DAY, -7, GETDATE()) THEN 1 ELSE 0 END) AS 'LW',
SUM(CASE WHEN ticketcreateddate > @BeginningOfYear THEN 1 ELSE 0 END) AS 'YTD',
CAST(COUNT(*) / DATEDIFF(WEEK, @BeginningOfYear, GETDATE()) AS float) AS 'Average Per Week'
FROM zendeskunclosedticketexport
WHERE groupname IN ('DC Web Ops', 'DC Maintenance', 'DC QC1')
GROUP BY groupname)
select p.groupname,sum(p.LW) as LW,sum(p.YTD) as YTD,sum(p.[Average Per Week]) as Average Per Week
from from cte GROUP BY groupname