SQL - 组合 DISTINCT 和 INNER JOIN 以及 COUNT(CASE WHEN)

标签 sql distinct case inner-join

我有 SQL 返回正确的结果。

select accounts.name, count( case when ((( estimated_start_date<='2013-01-01' 
and project.status='closed')

or ( estimated_start_date<='2013-01-01' and project.status='open' 
and estimated_end_date>='2013-04-01')))
then 1 else null end) as Number

from project

inner join project_cstm on project.id=project_cstm.id_c
inner join accounts on project_cstm.account_id_c=accounts.id

group by accounts.name

我返回了良好的结果:

举例:

Telenor 5
Telecom 3

现在我想在 WHERE 子句中添加新字段 BOOKED_DATE 来限制项目数量,仅在该时间间隔内创建一些项目任务。因此,我使用表 inner join project_task 进行 INNER JOIN,结果应该更小,但结果却是这些巨大的数字。不知道如何组合它。

感谢帮助

Telenor 150
Telecom 980

select accounts.name, count( case when ((( estimated_start_date<='2013-01-01' 
and project.status='closed')

or ( estimated_start_date<='2013-01-01' and project.status='open' 
and estimated_end_date>='2013-04-01')))
then 1 else null end) as Number

from project

inner join project_cstm on project.id=project_cstm.id_c
inner join accounts on project_cstm.account_id_c=accounts.id
inner join project_task on project_task.project_id=project.id
where booked_date>'2013-01-01' and booked_date<'2015-01-01'
group by accounts.name

由于表 PROJECT_TASK 中的行,我得到的结果远非正确的巨大结果。怎么限制呢?我尝试输入 ... count(distinct case when ... 但结果始终为 1。

所以我必须以某种方式限制这个值,但我不是这样

最佳答案

您为项目的每项任务数 1,这就是您有这么多的原因。 对于每个项目,您只需将计数增加 1 次。

您想要计算不同的项目,因此不要仅计算 1,而是计算不同的项目 ID:

select accounts.name
     , count( distinct  -- here distinct
        case when ((( estimated_start_date<='2013-01-01' and project.status='closed')
                 or ( estimated_start_date<='2013-01-01' and project.status='open' and estimated_end_date>='2013-04-01')))
        then project.id -- here project id
        else null 
        end) as Number
from project
    inner join project_cstm 
        on project.id=project_cstm.id_c
    inner join accounts 
        on project_cstm.account_id_c=accounts.id
    inner join project_task 
        on project_task.project_id=project.id
where booked_date>'2013-01-01' 
and booked_date<'2015-01-01'
group by accounts.name

关于SQL - 组合 DISTINCT 和 INNER JOIN 以及 COUNT(CASE WHEN),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15971157/

相关文章:

mysql - 如何处理具有相同id的mysql表

java - switch 语句有问题吗?

mysql - 以案例和组为中心

mysql - 添加列并根据条件填充升序数字

sql - sys.dm_fts_parser sql全文

php - 使用 SQL 查询将值数组插入数据库?

elasticsearch - 计算重复发生的频率

ruby-on-rails - Rails 模型不适用于独特的声明

c# - LINQ - Distinct 被忽略了吗?

mysql - 需要每个值类型的行数