cub*_*729 1 sql-server aggregate count sql-server-2012
我在 SQL Server 2012 中有下表:
CREATE TABLE [MyTable] (
[Id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
[MyGroup] INT NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我想输出表格的表格
| MyGroup | Count
Max | |
Min | |
Run Code Online (Sandbox Code Playgroud)
例如,如果我30
在MyTable的行,其中MyGroup的= 1
,20
行,其中MyGroup的= 2
,和10
行,其中MyGroup的= 3
,然后
| MyGroup | Count
Max | 1 | 30
Min | 3 | 10
Run Code Online (Sandbox Code Playgroud)
什么样的查询会输出这些信息?
这是 Travis 答案的另一种表述,它避免了对COUNT
两个方向进行排序的需要。
WITH s
AS (SELECT MyGroup,
Count(MyGroup) AS [Count],
MAX(Count(MyGroup)) OVER () AS [MaxMyGroup],
MIN(Count(MyGroup)) OVER () AS [MinMyGroup]
FROM MyTable
GROUP BY MyGroup)
SELECT Agg,
MyGroup,
V.[Count]
FROM s
CROSS APPLY (VALUES ( 'Max', CASE WHEN [Count] = [MaxMyGroup] THEN [Count] END),
('Min', CASE WHEN [Count] = [MinMyGroup] THEN [Count] END))
V(Agg, [Count])
WHERE V.[Count] IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
WITH s AS (
SELECT MyGroup, Count(MyGroup) AS [Count],
RANK() OVER (ORDER BY Count(MyGroup)) AS [rasc],
RANK() OVER (ORDER BY Count(MyGroup) DESC) AS [rdesc]
FROM MyTable
GROUP BY (MyGroup)
)
SELECT
CASE
WHEN [rasc] = 1 THEN 'Min'
ELSE 'Max'
END AS 'Agg',
[MyGroup],
[Count]
FROM s
WHERE [rasc] = 1 OR [rdesc] = 1
Run Code Online (Sandbox Code Playgroud)
更新: 马丁的替代方案非常有效。
这是马丁解决方案的另一种类似方法,
WITH s AS (
SELECT MyGroup, Count(MyGroup) AS [Count],
MAX(Count(MyGroup)) OVER () AS [Max],
MIN(Count(MyGroup)) OVER () AS [Min]
FROM MyTable
GROUP BY MyGroup
)
SELECT
CASE
WHEN [Count] = [Max] THEN 'Max'
ELSE 'Min'
END AS [Agg],
[MyGroup],
[Count]
FROM s
WHERE [Count] IN ([Max], [Min]);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14543 次 |
最近记录: |