【问题标题】:SQL COUNT And SUMSQL 计数和求和
【发布时间】: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 出现在单独的列中,而不是作为元数据嵌入列名中)

标签: sql count sum base libreoffice


【解决方案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 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-09
        • 1970-01-01
        • 2017-01-30
        • 1970-01-01
        相关资源
        最近更新 更多