联合和聚合函数

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