2016-01-20 76 views
-1

我有一个场景,我想在分组数据后对记录进行计数。 (实际方案包含多个表。)分组依据和组内计数

create table tblXYZ 
(
id int, 
Age int, 
Typ char 
) 

表包含了这样的数据:

| ID | Age | Typ 
------------------ 
| 1 | 20 | A 
| 2 | 20 | A 
| 3 | 21 | B 
| 4 | 22 | B 
| 5 | 22 | A 
| 6 | 23 | B 
| 7 | 23 | A 
| 8 | 23 | A 
| 9 | 25 | B 
| 10 | 25 | B 
| 11 | 25 | A 

如果我申请一组按年龄,我会得到:

| Age | Typ_Count 
------------- 
| 20 | 2 
| 21 | 1 
| 22 | 2 
| 23 | 3 
| 25 | 3 

但我想根据每个年龄组的每种特定类型获取typ_count。

期望的结果:

| Age | Typ_A_Count | Typ_B_Count 
    --------------------------------- 
    | 20 | 2   | 0 
    | 21 | 0   | 1 
    | 22 | 1   | 1 
    | 23 | 2   | 1 
    | 25 | 1   | 2 

感谢。

+2

请发表您尝试 –

+0

你可以使用一个支点,如果类型是静态的还是动态的支点来实现这一 –

+1

难道他们必须要在不同的列?你不能按年龄和类型分组吗?如果他们必须在列中使用每种类型的case语句。如果你有一个随机数的类型,那么你需要写一个动态的Piviot,如:http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query。太多的未知因素在这个时候提出“优质”建议。 – xQbert

回答

6

你可以指望多个类别是这样的:

SELECT 
    Age, 
    COUNT(CASE WHEN Typ = 'A' THEN 1 ELSE NULL END) AS CountTypA, 
    COUNT(CASE WHEN Typ = 'B' THEN 1 ELSE NULL END) AS CountTypB 
FROM tblXYZ 
GROUP BY Age 
4
SELECT Age,Typ 
FROM tblXYZ 
PIVOT 
(
count (Typ) FOR Typ IN ('A','B') 
)