mysql - 子查询中存在的情况

标签 mysql sql case exists

我正在尝试检查子查询中是否存在 ID。我只运行了子查询,它生成了所有对其收费的 ID 的列表,所以我想做的是检查主查询中的 ID 是否存在于子查询中。如果存在则返回 1,否则返回 0。 这是一个简单的查询,但我不知道哪里出错了,我尝试使用 exists 而不是 in 但这也不起作用。

case when debtor._rowid in (
          select distinct note.debtorid from note 
              left join debtor on note.debtorid = debtor._rowid
              left join fee    on fee.debtorid = debtor._rowid
          where fee.type = "Enforcement" and note.type = "Stage") 
     then 1 else 0 end) as `Enforcement`

下面是完整的代码,当我从下面的主查询中删除上面的代码时,它工作得很好,所以我的 case 语句有问题。

with cte_1
as
(
    select 
        debtor._rowid as casref
        ,concat(date_format(date_sub(debtor._createddate, interval 3 month), '%y'), '/', date_format(date_add(debtor._createddate, interval 9 month), '%y')) as `F/Y`
        ,date_format(debtor._createddate, '%M %Y') as `Loaded Month`
        ,ifnull(concat(date_format(date_sub(debtor.offence_date, interval 3 month), '%y'), '/', date_format(date_add(debtor.offence_date, interval 9 month), '%y')),'-') as `LO F/Y`
        ,coalesce(date_format(debtor.offence_date,'%M %Y'),'-') as `Liability Order Month`
        ,scheme.name as  `Scheme`
        ,branch.name as `Branch`
        ,count(debtor._rowid) as `Cases Received`
        ,count(debtor.linkid) as `LinkID`
        ,(case 
            when concat(date_format(date_sub(debtor._createddate, interval 3 month), '%y'), '/', date_format(date_add(debtor._createddate, interval 9 month), '%y'))
             = ifnull(concat(date_format(date_sub(debtor.offence_date, interval 3 month), '%y'), '/', date_format(date_add(debtor.offence_date, interval 9 month), '%y')),'-')
             then 1 else 0 end ) as `Same Year`
        , case when debtor._rowid in (
                    select distinct note.debtorid from note 
                        left join debtor on note.debtorid = debtor._rowid
                        left join fee    on fee.debtorid = debtor._rowid
                    where fee.type = "Enforcement" 
                    and note.type = "Stage") 
                then 1 else 0 end) as `Enforcement`

        from debtor
        left join clientscheme          on debtor.clientschemeID = clientscheme._rowid
        left join scheme                on clientscheme.schemeID = scheme._rowid
        left join branch                on clientscheme.branchID = branch._rowid
        left join fee                   on debtor._rowid = fee.debtorid
        left join note                  on debtor._rowid = note.debtorid
    where clientscheme.branchID in (1,10,24)
    and debtor._createddate >= '2017-04-01'
    group by debtor._rowid
)
,
cte_2
as
(
select 
    `F/Y`
    ,`Loaded Month` 
    ,`LO F/Y`
    ,`Liability Order Month`
    ,`Scheme`
    ,`Branch`
    ,sum(`Cases Received`) as `Case Count`
    ,sum(`LinkID`) as `Linked Accounts`
    ,sum(`Same Year`) as `In Year LO`
    ,sum(Enforcement) as `Enforcement Applied`
from cte_1
group by 
    `Loaded Month`
    ,`Liability Order Month`
    ,`Scheme`
    , `Branch`

)

select 
    `F/Y`
    ,`Loaded Month`
    ,`LO F/Y`
    ,`Liability Order Month`
    ,`Scheme`
    ,`Branch`
    ,`Case Count`
    ,`Linked Accounts`
    ,round((`Linked Accounts`/`Case Count`),2) * 100 as `% of Linked Accounts`
    ,round((`In Year LO`/`Case Count`),2) * 100 as `In Year LO's`
    ,`Enforcement Applied`
from cte_2





最佳答案

对于结果集中的给定记录,您似乎想要从逻辑上检查 debtor 表中的 _noteid 值是否与 debtors 匹配 来自 note 表。您可以按如下方式重新表述您的查询:

SELECT
    (d._rowid = n.debtorid) AS `Enforcement Allocated`
FROM note n
LEFT JOIN debtor d
    ON n.debtorid = d._rowid
LEFT JOIN fee f
    ON f.debtorid = d._rowid
WHERE
    f.type = 'Enforcement' AND n.type = 'Stage';

请注意,由于 CASE 表达式的输出只是 1 或 0,您可以利用 MySQL 允许 bool 表达式作为值的优势。

关于mysql - 子查询中存在的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57288799/

相关文章:

mysql - 如何在 SQL 中检索具有特定数量的不同列值的行?

php - SQLSTATE[HY000] [2002] yii2 中没有那个文件或目录

mysql加入线程收件箱

mysql - 仅当同一字段中的另一个值不存在时,如何才能在 MySQL 中显示该字段值? IF/ELSEIF 还是 CASE?

SQL 查询 - 从 CASE 计算新定义的值

mysql - 如何从 Linux shell 脚本运行 MySQL 过程并将其输出存储在文件中

php - Jquery:从 mysql 获取值

sql - SQL中如何替换Left Join语句中的部分字符串

php - 创建具有匹配列的 sql View

sql - PostgreSQL:如何更新表中的日期?