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;
我需要做我已经做过的事情
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;