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 Server 2008 R2 子查询分组、求和和计数