[英]Group by, multiple count, multiple tables SQL Server
我有两个表,如下所示:
第一张桌子:2016年
Os | Count
------------+----------
Windows 7 8
Windows 7 9
Windows 7 20
Windows 8 30
Linux 15
第二表:2017年
Os | Count
------------+----------
Windows 7 35
Windows 7 11
Windows 8 10
Windows 8 8
Linux 10
Ubuntu 3
我自己尝试,但是我的挑战是在同时计算两个不同表中的两个字段时使用GROUP BY函数,但总是出错。
先感谢您,
更新:
抱歉,我在解释我的请求时犯了一个错误:我需要写一个查询来获得如下结果:
--OS-- --2016-- --2017--
------------------------------------
Windows 7 37 46
Windows 8 30 18
Linux 15 10
Ubuntu 0 3
您可以按以下方式进行简单分组:
select a.OS, sum(count) from (
select * from your2016table
union all
select * from your2017table
) a
group by a.OS
为此,您可以将year作为分组依据并进行透视
;with cte as (
select a.OS, a.[year], SumCt = sum(count) from (
select *, 2016 as [year] from your2016table
union all
select *, 2017 as [year] from your2017table
) a
group by a.OS, a.[year]
)
select * from cte
pivot (max(sumct) for [year] in ([2016], [2017])) p
没有UNION ALL
您可以执行以下操作:
SELECT
COALESCE( [2016].[OS], [2017].[OS] ) AS [OS],
( [2016].[Count] + [2017].[Count] ) AS [Count]
FROM
[2016]
FULL OUTER JOIN [2017] ON [2016].[OS] = [2017].[OS]
假设OS
列不包含重复项,这也消除了对GROUP BY
的需要。
需要通过GROUP BY
(而不是SELECT DISTINCT
)消除重复项,但是适用相同的结构:
SELECT
COALESCE( [2016-D].[OS], [2017].[OS] ) AS [OS],
( [2016-D].[Count] + [2017].[Count] ) AS [Count]
FROM
(
SELECT [OS], SUM( [Count] ) FROM [2016] GROUP BY [OS]
) AS [2016-D]
FULL OUTER JOIN
(
SELECT [OS], SUM( [Count] ) FROM [2017] GROUP BY [OS]
) AS [2017-D]
ON [2016].[OS] = [2017].[OS]
...但是随后变得非常笨拙,并且UNION ALL
方法变得更加简单!
OP修改了他们的问题,说他们想要单独的列-因此在这里使用OUTER JOIN
成为理想的解决方案:
SELECT
COALESCE( [2016-D].[OS], [2017-D].[OS] ) AS [OS],
[2016-D].[Count] AS [2016],
[2017-D].[Count] AS [2017]
FROM
(
SELECT
[OS],
SUM( [Count] ) AS [Count]
FROM
[2016]
GROUP BY
[OS]
) AS [2016-D]
FULL OUTER JOIN
(
SELECT
[OS],
SUM( [Count] ) AS [Count]
FROM
[2017]
GROUP BY
[OS]
) AS [2017-D]
ON [2016].[OS] = [2017].[OS]
ORDER BY
[OS]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.