MySQL:两个条件下多列整数值的计数和总和

MySQL: Count and sum of integer values in multiple columns on two criterion

我需要做我已经做过的事情 。这次我想要一个基于两个标准的结果。所以我有一个像这样的table。

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

到我的另一个问题,给出一个 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;

如何实现这个结果?

这根本不需要 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;

随着您练习逻辑,您应该会更容易弄清楚如何自己解决这些问题。

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 

如果您希望它能够处理任意数量的发布者,那么我建议您不要无限增加列数,而是为发布者 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;