是否可以组合 Group by、Having 和 Sum?
Is it possible to combine Group by, Having and Sum?
我有一个 table:
------------------------
|id|p_id|desired|earned|
------------------------
|1 | 1 | 5 | 7 |
|2 | 1 | 15 | 0 |
|3 | 1 | 10 | 0 |
|4 | 2 | 2 | 3 |
|5 | 2 | 2 | 3 |
|6 | 2 | 2 | 3 |
------------------------
我需要做一些计算,并尝试在一个不太复杂的请求中进行计算,否则我知道如何通过请求数来计算它。
我需要如下结果 table:
---------------------------------------------------------
|p_id|total_earned| AVG | Count | SUM |
| | | (desired)|(if earned != 0)|(desired)|
---------------------------------------------------------
| 1 | 7 | 10 | 1 | 30 |
| 2 | 9 | 2 | 3 | 6 |
---------------------------------------------------------
我到目前为止构建:
SELECT p_id, SUM(earned), AVG(desired), Sum(desired)
FROM table GROUP BY p_id
但是我不知道如何计算带条件的分组记录数。我可以用 HAVING
得到这个号码,但在单独的请求中。
我几乎确定 SQL 应该有这种力量。
您可以为此使用 CASE
表达式。
试试这个,
SELECT p_id
,SUM(earned) AS total_earned
,AVG(desired) AS avg_desired
,COUNT(CASE WHEN Earned!=0 THEN 1 END) AS earned_count
,SUM(desired) AS sum_desired
FROM table
GROUP BY p_id;
您几乎完成了查询,只需在 case
表达式的帮助下添加条件聚合以获得计数
SELECT
p_id,
SUM(earned) [total_earned],
AVG(desired) [desired],
SUM(CASE WHEN earned <> 0 THEN 1 ELSE 0 END) [COUNT],
SUM(desired) [SUM] FROM <table>
GROUP BY p_id
结果
p_id total_earned desired COUNT SUM
1 7 10 1 30
2 9 2 3 6
CASE
的更短替代方案是
SELECT p_id,
SUM(earned) AS total_earned,
AVG(desired) AS average_desired,
COUNT(earned != 0 OR NULL) AS earned_count,
SUM(desired) AS sum_desired
FROM table GROUP BY p_id;
因为NULL
没有计算在内
NULLIF()
是标准的 SQL 并且可能是最短的:
SELECT p_id
, count(NULLIF(earned, 0)) AS earned_count
-- , more ...
FROM table
GROUP BY 1;
count()
只计算非空值。
更多变体:
我有一个 table:
------------------------
|id|p_id|desired|earned|
------------------------
|1 | 1 | 5 | 7 |
|2 | 1 | 15 | 0 |
|3 | 1 | 10 | 0 |
|4 | 2 | 2 | 3 |
|5 | 2 | 2 | 3 |
|6 | 2 | 2 | 3 |
------------------------
我需要做一些计算,并尝试在一个不太复杂的请求中进行计算,否则我知道如何通过请求数来计算它。 我需要如下结果 table:
---------------------------------------------------------
|p_id|total_earned| AVG | Count | SUM |
| | | (desired)|(if earned != 0)|(desired)|
---------------------------------------------------------
| 1 | 7 | 10 | 1 | 30 |
| 2 | 9 | 2 | 3 | 6 |
---------------------------------------------------------
我到目前为止构建:
SELECT p_id, SUM(earned), AVG(desired), Sum(desired)
FROM table GROUP BY p_id
但是我不知道如何计算带条件的分组记录数。我可以用 HAVING
得到这个号码,但在单独的请求中。
我几乎确定 SQL 应该有这种力量。
您可以为此使用 CASE
表达式。
试试这个,
SELECT p_id
,SUM(earned) AS total_earned
,AVG(desired) AS avg_desired
,COUNT(CASE WHEN Earned!=0 THEN 1 END) AS earned_count
,SUM(desired) AS sum_desired
FROM table
GROUP BY p_id;
您几乎完成了查询,只需在 case
表达式的帮助下添加条件聚合以获得计数
SELECT
p_id,
SUM(earned) [total_earned],
AVG(desired) [desired],
SUM(CASE WHEN earned <> 0 THEN 1 ELSE 0 END) [COUNT],
SUM(desired) [SUM] FROM <table>
GROUP BY p_id
结果
p_id total_earned desired COUNT SUM
1 7 10 1 30
2 9 2 3 6
CASE
的更短替代方案是
SELECT p_id,
SUM(earned) AS total_earned,
AVG(desired) AS average_desired,
COUNT(earned != 0 OR NULL) AS earned_count,
SUM(desired) AS sum_desired
FROM table GROUP BY p_id;
因为NULL
没有计算在内
NULLIF()
是标准的 SQL 并且可能是最短的:
SELECT p_id
, count(NULLIF(earned, 0)) AS earned_count
-- , more ...
FROM table
GROUP BY 1;
count()
只计算非空值。
更多变体: