我有三个表:历史,视频和用户.以下两个查询为每个视频显示法国用户或德国用户的观看次数:
SELECT V.idVideo, COUNT(H.idVideo) AS nb_fr
FROM HISTORY H
INNER JOIN VIDEO V ON V.idVideo = H.idVideo
INNER JOIN USER U ON U.idUser = H.idUser
WHERE U.nationality = 'french'
GROUP BY H.idVideo
ORDER BY V.idVideo;
Run Code Online (Sandbox Code Playgroud)
和
SELECT V.idVideo, COUNT(H.idVideo) AS nb_ge
FROM HISTORY H
INNER JOIN VIDEO V ON V.idVideo = H.idVideo
INNER JOIN USER U ON U.idUser = H.idUser
WHERE U.nationality = 'german'
GROUP BY H.idVideo
ORDER BY V.idVideo
Run Code Online (Sandbox Code Playgroud)
但是如何将这两个查询结合起来只有一个?我想要这样的东西:
idVideo | nb_fr | nb_ge
-----------------------
1 | 5 | 4
2 | 3 | 6
3 | 2 | 8
4 | 3 | 3
Run Code Online (Sandbox Code Playgroud)
使用case表达式进行条件聚合:
SELECT V.idVideo,
COUNT(case when U.nationality = 'french' then H.idVideo end) AS nb_fr,
COUNT(case when U.nationality = 'german' then H.idVideo end) AS nb_ge
FROM HISTORY H
INNER JOIN VIDEO V ON V.idVideo = H.idVideo
INNER JOIN USER U ON U.idUser = H.idUser
WHERE U.nationality in ('french', 'german')
GROUP BY V.idVideo
ORDER BY V.idVideo;
Run Code Online (Sandbox Code Playgroud)
请注意更改为GROUP BY V.idVideo,因为这是所选列.
您可以使用条件聚合执行以下操作CASE EXPRESSION:
SELECT V.idVideo,
COUNT(CASE WHEN U.nationality = 'french' THEN 1 END) AS nb_fr,
COUNT(CASE WHEN U.nationality = 'german' THEN 1 END) AS nb_ge
FROM HISTORY H
INNER JOIN VIDEO V ON V.idVideo = H.idVideo
INNER JOIN USER U ON U.idUser = H.idUser
GROUP BY H.idVideo
ORDER BY V.idVideo
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
208 次 |
| 最近记录: |