2009-11-18 23 views
2

我在寻找的是将同一个表中的不同数据进行分组并计数,并将它们显示在两个不同的列中。如下所示。在列中计数值

数据表A

领域:从查询

Name Type 
Bob 1 
John 2 
Bob 1 
Steve 1 
John 1 
Bob 2 

期望的结果:

Name Type 1 Type 2 
Bob 2  1 
John 1  1 
Steve 1  0 
+1

哎呀,我认为这将取决于RDMS;不确定它可以在ANSI SQL中完成。这是哪个数据库? –

回答

7

这将做在SQL Server的伎俩:

SELECT 
    name, 
    SUM(CASE type WHEN 1 THEN 1 ELSE 0 END) AS type1, 
    SUM(CASE type WHEN 2 THEN 1 ELSE 0 END) AS type2 
FROM 
    myTable 
GROUP BY 
    name 
+0

非常符合我写的内容。 – ale

+0

在SQL Server中,您将使用CASE ... END语句,但没有IF()语法。 –

+0

感谢Philip,在Adam指定RDBMS之前,我写了它。 – Seb

0

@Seb有一个很好的解决方案,但它是依赖于服务器。下面是一个使用子查询,应该是便携式备用:

select 
    name, 
    (select count(type) from myTable where type=1 and name=a.name) as type1, 
    (select count(type) from myTable where type=2 and name=a.name) as type2 
from 
    myTable as a 
group by 
    name 
0

使用两个单独的GROUP BY子查询。

SELECT Name, a.Count1, b.Count2 
from myTable 
JOIN 
    (SELECT Name, SUM(Type) AS Count1 FROM myTable GROUP BY Name WHERE Type=1) AS a ON a.Name = myTable.Name 
    (SELECT Name, SUM(Type) FROM myTable GROUP BY Name WHERE Type=2) AS b ON b.Name = myTable.Name 
2

没时间写代码,但Case语句就是你想要的。如果它满足要求,那么它的值为1,如果不满足则为零。然后你可以对列进行求和。

0

你正在寻找一个交叉的解决方案。上述解决方案可以工作,但如果你想要一个通用的解决方案并且有N种类型的话你就会陷入僵局。

CrossTab解决方案将为您解决这个问题。如果这是为了快速处理一些数字,那么将数据转储到Excel中并使用本机数据透视表功能。

如果是针对应用程序中的RDBMS,则它取决于RDBMS。 MS SQL 2005及更高版本具有交叉表语法。见:

http://www.databasejournal.com/features/mssql/article.php/3521101/Cross-Tab-reports-in-SQL-Server-2005.htm