sql一个表中同时查询两个count的sql语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql一个表中同时查询两个count的sql语句相关的知识,希望对你有一定的参考价值。

我有一个question表,里面一条记录是一道题,现在我要在界面上显示每套题的信息,需要获取每套题的题目数量和已审核的数量。(statu = 1为已审核,0为未审核)
表结构如下
questionID paperName statu
1 xx学校期中考试 1
2 xx学校期中考试 1
3 xx学校期中考试 0
4 xx学校期末考试 0
4 xx学校期末考试 1
查询出的结果是
试卷名 题目数量 审核数量
xx学校期中考试 3 2
xx学校期末考试 2 1

我写的sql
select COUNT(1) as 总题数,paperName from question where
papername in(select distinct paperName from question)
group by paperNme
select COUNT(1) as 审核题数,paperName from question where
papername in(select distinct paperName from question) and statu=1
group by paperNme
我的的sql语句只能查出一个题目数量或者审核数量
如何让两个一起查询出来?

可以有两种解决方法,

所需工具:SQL

查询两个count的方法1:

SELECT paperName
    , COUNT (1) AS 总题数
    , sum (CASE WHEN statu = 1 THEN 1 ELSE 0 END) AS 审核题数
FROM question
GROUP BY paperNme

查询两个count的方法2:

select s.总题数, s.审核题数, s.paperName
from (
select COUNT(1) as 总题数, case when status = 1 then count(1) else 0 end as 审核题数,  paperName
from question
--where papername in (select distinct paperName from question), 这个条件可以不要了
group by paperNme, stauts -- status也要作为分组字段,因为在case中有使用
) s

备注:两个都可以使用。

参考技术A

除了count之外还有一个函数叫做 SUM。

SELECT paperName
    , COUNT (1) AS 总题数
    , sum (CASE WHEN statu = 1 THEN 1 ELSE 0 END) AS 审核题数
FROM question
GROUP BY paperNme

papername in(select distinct paperName from question)   这个没意义吧? 都是同一张question表,要不就是你表名写错了。


Good Luck !

追问

恩恩,写的这个可以查出来,之前还没怎么用过sum,现在知道了
papername in(select distinct paperName from question) 这个写得有点多余了,我在我数据库中是可以查出来的,

感谢感谢 采纳你的了

本回答被提问者采纳
参考技术B

可以有两种解决方法。

方法1:

SELECT paperName

, COUNT (1) AS 总题数

, sum (CASE WHEN statu = 1 THEN 1 ELSE 0 END) AS 审核题数

FROM question

GROUP BY paperNme 

方法2:

select s.总题数, s.审核题数, s.paperName

from (

select COUNT(1) as 总题数, case when status = 1 then count(1) else 0 end as 审核题数,  paperName

from question

--where papername in (select distinct paperName from question), 这个条件可以不要了

group by paperNme, stauts -- status也要作为分组字段,因为在case中有使用

) s

参考技术C

用case when根据条件计数:

select s.总题数, s.审核题数, s.paperName
from (
select COUNT(1) as 总题数, case when status = 1 then count(1) else 0 end as 审核题数,  paperName
from question
--where papername in (select distinct paperName from question), 这个条件可以不要了
group by paperNme, stauts -- status也要作为分组字段,因为在case中有使用
) s

追问

你写的也蛮不错,但是别人先回答的问题已近解决了
sorry!

追答

不错,我也学习了。

SQL Count Distinct Value Oldest DateTime

【中文标题】SQL Count Distinct Value Oldest DateTime【英文标题】: 【发布时间】:2019-08-07 03:24:04 【问题描述】:

我正在处理两个数据集,并尝试在输出中创建一个包含唯一值计数的新列。在我的查询中,我有多个 Case When 子句,其中一个表中的唯一数字字符串将指示输出中的唯一字符串/句子值。在 Else 语句中,存在于第二个表中但不存在于第一个表中的任何这些唯一数字字符串(第二个表中的最后一列,第一个表中的第一列)将导致输出中的总计数。我的问题是计数应该只针对不同用户 ID 的最旧的 DateTime 实例。我构建了一个边缘案例来检查我的输出是否正常工作,如果他们有多个相同标识符但不同字符串的实例,它会输出用户 ID 的计数。我希望输出仅根据最早的 DateTime 对每个不同用户的每个标识符计数一次。

某些数据可能如下所示:

1581 | billy | abcd | red dead | company1
1903 | bob   | defg | halo 3   | company2
5849 | lilly | hijk | fortnite | company3
1903 | bob   | hijk | fortnite | company3

某些数据可能如下所示:

d83j | 2012-09-28 | 2012-09-28 09:00:00.00 | abcd | 1010
np50 | 2012-09-28 | 2012-09-28 10:45:00.00 | abcd | 1581
j99p | 2012-09-28 | 2012-09-28 11:00:00.00 | abcd | 1581
rn2n | 2012-09-28 | 2012-09-28 18:30:00.00 | defg | 1903
rn2n | 2012-09-28 | 2012-09-28 15:30:00.00 | defg | 1903
rn2n | 2012-09-28 | 2012-09-28 07:30:00.00 | defg | 6211
44ko | 2012-09-28 | 2012-09-28 18:30:00.00 | hijk | 5849

这是我目前的查询:

SELECT 
  F.Identifier, F.Videogame, F.Developer,
CASE WHEN S.String='1581' THEN 'Made by billy'
     WHEN S.String='1903' THEN 'Made by bob'
     WHEN S.String='5849' THEN 'Made by lilly'
     ELSE 'worked on by someone else' END AS Final_Name,
     COUNT(distinct S.User_ID) as Count
FROM 
  table1 as F
JOIN 
  table2 as S
ON
  F.Identifier=S.Identifier
GROUP BY
  F.Identifier, F.Videogame, F.Developer, Final_Name

我试图在计数周围包含有和 where 子句并子查询计数 S.User_ID,但我所做的一切都没有让我得到我想要实现的目标。

现在的实际输出如下所示:

abcd | red dead | company1 | worked on by someone else | 1
abcd | red dead | company1 | Made by billy             | 2
defg | halo 3   | company2 | Made by bob               | 1
defg | halo 3   | company2 | worked on by someone else | 1
hijk | fortnite | company3 | Made by lilly             | 1

因为 user_id rn2n 有多个实例都具有相同的标识符,所以输出应该只返回最旧的日期时间实例(即 07:30:00.00 实例。)当前输出计算每个字符串的不同 user_id,这就是为什么 rn2n 计算一次为 made由鲍勃和一次由其他人制作。

预期的输出应该是这样的:

abcd | red dead | company1 | worked on by someone else | 1
abcd | red dead | company1 | Made by billy             | 2
defg | halo 3   | company2 | worked on by someone else | 1
hijk | fortnite | company3 | Made by lilly             | 1

【问题讨论】:

不清楚为什么defg | halo 3 | company2 | Made by bob | 1这一行应该被删除——请解释一下使用这一行的逻辑 由于 user_id rn2n 有 3 个 defg 标识符实例,因此只有 table2 中最旧的日期时间(即 07:30:00)行应计入输出。输出中的 abcd 标识符可以有多行,因为它来自不同的唯一 user_id。 知道了。有道理。很快就会回答 【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT F.Identifier, F.Videogame, F.Developer,
CASE WHEN S.String='1581' THEN 'Made by billy'
     WHEN S.String='1903' THEN 'Made by bob'
     WHEN S.String='5849' THEN 'Made by lilly'
     ELSE 'worked on by someone else' END AS Final_Name,
     COUNT(DISTINCT S.User_ID) AS COUNT
FROM `project.dataset.table1` AS F
JOIN (
  SELECT AS VALUE ARRAY_AGG(t ORDER BY datetime LIMIT 1)[OFFSET(0)]
  FROM `project.dataset.table2` t
  GROUP BY User_ID

) AS S
ON F.Identifier=S.Identifier
GROUP BY F.Identifier, F.Videogame, F.Developer, Final_Name 

如果适用于您问题的样本数据 - 结果将是

Row Identifier  Videogame   Developer   Final_Name                  Count    
1   abcd        red dead    company1    worked on by someone else   1    
2   abcd        red dead    company1    Made by billy               2    
3   defg        halo 3      company2    worked on by someone else   1    
4   hijk        fortnite    company3    Made by lilly               1    

【讨论】:

以上是关于sql一个表中同时查询两个count的sql语句的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句 怎么把从一个表中查出来数据插入到另一个表中

sql语句如何查询一个表中某两个字段的相同数据?

怎么样用SQL语句查询某一个表里面的某一个字段的总和

SQL多表链接查询、嵌入SELECT语句的子查询技术

SQL语句怎么同时往两个表中插入不同的记录

sql语句分页查询,如何同时返回记录总条数