计算列中的值

时间:2009-11-18 18:38:23

标签: sql sql-server-2005

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

表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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

没时间编写代码,但Case语句就是你想要的。如果它符合案例,则其值为1,如果不符合则为零。然后你可以对列进行求和。

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:0)

您正在寻找CrossTab解决方案。上述解决方案可行,但如果您需要通用解决方案并且有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