【问题标题】:MySQL: Count and sum of integer values in multiple columns on two criterionMySQL:根据两个标准计算多列中整数值的总和
【发布时间】:2015-10-30 13:18:48
【问题描述】:

我需要做与here 相同的事情。这次我想要一个基于两个标准的结果。所以我有一张这样的桌子。

images     |     videos      |      reviews        |       publisherId
----------------------------------------------------------------------------
0          |     2           |       1             |          91
4          |     5           |       0             |          91
11         |     1           |       4             |          12
0          |     1           |       7             |          12
2          |     1           |       9             |          12

我需要编写一个查询来计算每列中不等于0 的行数,并给出列中数字的实际总和,并根据publisherId 排列结果。所以结果会是这样的。

Columns     |     Counts(91)   |    Sum(91)  |    Counts(12)   |    Sum(12)
----------------------------------------------------------------------------
images      |     1            |    4        |     2           |    13
videos      |     2            |    7        |     3           |    3
reviews     |     1            |    1        |     3           |    20

answer 到我的另一个问题,给出一个publisherId 的结果的查询是这样的。

SELECT 'images' as `columns`, SUM(images <> 0) as counts, SUM(images) as `sum`
FROM dpsreport where publisherId = 91
UNION ALL
SELECT 'videos', SUM(videos <> 0), SUM(videos)
FROM dpsreport where publisherId = 91
UNION ALL
SELECT 'reviews', SUM(reviews <> 0), SUM(reviews)
FROM dpsreport where publisherId = 91;

我如何实现这个结果?

【问题讨论】:

标签: mysql sql count addition


【解决方案1】:

这根本不需要join。这只是更多的条件聚合。我将展示发布者 91 的逻辑。您可以自己为 12 添加两列:

SELECT 'images' as `columns`,
       SUM(images <> 0 and publisherid = 91) as counts_91,
       SUM(case when publisherid = 91 then images else 0 end) as sum_91
FROM dpsreport
UNION ALL
SELECT 'videos',
       SUM(videos <> 0 and publisherid = 91) as counts_91,
       SUM(case when publisherid = 91 then videos else 0 end) as sum_91
FROM dpsreport
UNION ALL
SELECT 'reviews',
       SUM(reviews <> 0 and publisherid = 91) as counts_91,
       SUM(case when publisherid = 91 then reviews else 0 end) as sum_91
FROM dpsreport;

当你练习逻辑时,你应该更容易弄清楚如何自己解决这些问题。

【讨论】:

  • 非常感谢您的耐心等待。我对 SQL 中的条件聚合没有任何经验。而且我还添加了 12 列并且它有效。
【解决方案2】:
SELECT 'images' as `columns`, 
       IF(publisherId=91, SUM(images <> 0), 0) as counts91, 
       IF(publisherId=91, SUM(images), 0) as `sum91`, 
       IF(publisherId=12, SUM(images <> 0), 0) as counts12, 
       IF(publisherId=12, SUM(images), 0) as `sum12`
FROM dpsreport
group by publisherId 
UNION ALL
SELECT 'videos' as `columns`, 
       IF(publisherId=91, SUM(videos<> 0), 0) as counts91, 
       IF(publisherId=91, SUM(videos), 0) as `sum91`, 
       IF(publisherId=12, SUM(videos<> 0), 0) as counts12, 
       IF(publisherId=12, SUM(videos), 0) as `sum12`
FROM dpsreport
group by publisherId 
UNION ALL
SELECT 'reviews' as `columns`, 
       IF(publisherId=91, SUM(reviews<> 0), 0) as counts91, 
       IF(publisherId=91, SUM(reviews), 0) as `sum91`, 
       IF(publisherId=12, SUM(reviews<> 0), 0) as counts12, 
       IF(publisherId=12, SUM(reviews), 0) as `sum12`
FROM dpsreport
group by publisherId 

【讨论】:

    【解决方案3】:

    如果您希望它能够处理任意数量的发布商,那么我建议您不要无限增加列数,而是为发布商 ID 添加一个额外列并在不同级别处理重组:

    SELECT publisherId, 'images' as `columns`, SUM(images <> 0) as counts, SUM(images) as `sum`
    FROM dpsreport  GROUP BY publisherId
    UNION ALL
    SELECT publisherId, 'videos', SUM(videos <> 0), SUM(videos)
    FROM dpsreport GROUP BY publisherId
    UNION ALL
    SELECT publisherId, 'reviews', SUM(reviews <> 0), SUM(reviews)
    FROM dpsreport GROUP BY publisherId;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 2017-07-25
      • 2014-10-01
      相关资源
      最近更新 更多