SQL 计数和求和

Posted

技术标签:

【中文标题】SQL 计数和求和【英文标题】:SQL COUNT And SUM 【发布时间】:2015-05-14 08:41:04 【问题描述】:

我有一张桌子有这个 表 done_by

Var_ID| Var_name| Q1_by  |Q2_by|Q3_by|Q4_by
1     |    abc  |   me   | me  |me   |you
2     |    cba  |   me   | me  |you  |you
3     |    abd  |   me   | you |you  |me

我想要得到的结果是得到所有的总和 我和你重视 我=7 你=5

已完成计数,但我无法得到每列的所有“我”的计数

【问题讨论】:

您使用的是什么版本的 SQL? Microsoft SQL Server、mysql、Oracle 或其他数据库引擎? 当您想要计算/比较多列中的值时,这通常表明数据模型损坏 - 通常表明应该有单列和更多行(并且 Q1 - Q4 也应该作为 data 出现在单独的列中,而不是作为元数据嵌入列名中) 【参考方案1】:

您可以使用以下条件聚合:

SELECT SUM(CASE WHEN Q1_by = 'me' THEN 1 ELSE 0 END + 
           CASE WHEN Q2_by = 'me' THEN 1 ELSE 0 END +
           CASE WHEN Q3_by = 'me' THEN 1 ELSE 0 END +
           CASE WHEN Q4_by = 'me' THEN 1 ELSE 0 END) AS me ,
       SUM(CASE WHEN Q1_by = 'you' THEN 1 ELSE 0 END + 
           CASE WHEN Q2_by = 'you' THEN 1 ELSE 0 END +
           CASE WHEN Q3_by = 'you' THEN 1 ELSE 0 END +
           CASE WHEN Q4_by = 'you' THEN 1 ELSE 0 END) AS you
FROM TableName

【讨论】:

感谢 Giorgi Nakeuri,条件聚合有效并为我提供了我需要的结果,谢谢!【参考方案2】:

使用每季度的个人计数并添加它们

SELECT (
(SELECT Count(Q1_by) FROM done_by WHERE Q1_by = 'me')+
(SELECT Count(Q2_by) FROM done_by WHERE Q2_by = 'me')+
(SELECT Count(Q3_by) FROM done_by WHERE Q3_by = 'me')+
(SELECT Count(Q4_by) FROM done_by WHERE Q4_by = 'me')) AS MeCount,
(
(SELECT Count(Q1_by) FROM done_by WHERE Q1_by = 'you')+
(SELECT Count(Q2_by) FROM done_by WHERE Q2_by = 'you')+
(SELECT Count(Q3_by) FROM done_by WHERE Q3_by = 'you')+
(SELECT Count(Q4_by) FROM done_by WHERE Q4_by = 'you')) AS YouCount
FROM done_by

IDEONE 链接:https://ideone.com/ZAuS5O

【讨论】:

【参考方案3】:
DECLARE @byMe INT = 0;

SELECT @byMe = @byMe + COUNT(*) FROM dbo.tablName
WHERE Q1_by = 'me';

SELECT @byMe = @byMe + COUNT(*) FROM dbo.tablName
WHERE Q2_by = 'me';

SELECT @byMe = @byMe + COUNT(*) FROM dbo.tablName
WHERE Q3_by = 'me';

SELECT @byMe = @byMe + COUNT(*) FROM dbo.tablName
WHERE Q4_by = 'me';

SET @byMe = @byMe * 7;

【讨论】:

【参考方案4】:

使用“Sum”而不是“Count”的条件聚合是可行的方法,如果您不知道不同的值,可以使用动态 sql 对其进行扩展 -

--Dynamic SQL Extension to count sum of all distinct values
--Extract out distinct values in temporary table
SELECT DISTINCT by_val=val INTO #by_tbl FROM (SELECT  val=Q1_by
FROM #TableName
UNION ALL 
SELECT  val=Q2_by
FROM #TableName
UNION ALL 
SELECT val=Q3_by
FROM #TableName
UNION ALL 
SELECT val=Q4_by
FROM #TableName) A


--Create a SQL String 
DECLARE @sql NVARCHAR(max)

SELECT @sql = ISNULL(@sql+',', 'SELECT ') + '['+by_val+']=SUM(CASE WHEN Q1_by='''+by_val+''' THEN 1 ELSE 0 END 
                + CASE WHEN Q2_by='''+by_val+''' THEN 1 ELSE 0 END 
                + CASE WHEN Q3_by='''+by_val+''' THEN 1 ELSE 0 END 
                + CASE WHEN Q4_by='''+by_val+''' THEN 1 ELSE 0 END) '

FROM #by_tbl

SET @sql = @sql + ' FROM #TableName'

EXEC(@SQL)


DROP TABLE #TableName
DROP TABLE #by_tbl 

【讨论】:

以上是关于SQL 计数和求和的主要内容,如果未能解决你的问题,请参考以下文章

SQL 计数和求和

SQL Server 2008 R2 子查询分组、求和和计数

基于匹配值的雪花SQL计数和从另一个表求和

对 SQL 中多列中的行计数求和的查询

分组值在 SQL (maria DB) 中按时间存储直到零,并与计数一起进行求和

Oracle SQL - 基于分组和条件运行求和