【问题标题】:Case When Exists In Subquery子查询中存在的情况
【发布时间】:2019-12-08 20:34:43
【问题描述】:

我正在尝试检查子查询中是否存在 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





【问题讨论】:

  • 您发布的错误信息与代码无关。发布产生错误的代码。
  • @forpas 我现在已经包含了整个代码,以便更清楚地了解发生了什么
  • case when debtor._rowid exists中删除debtor._rowidcase when exists(...
  • 您发布了带有存在的案例声明并再次将其删除。删除then 1 else 0 end后面的括号。
  • 是的,我的本意是使用in 而不是exists 来发布我更改它的原因。 DUHHH 我没有意识到我有一个额外的括号,感谢您的帮助,非常感谢

标签: mysql sql case exists


【解决方案1】:

您似乎想从逻辑上检查,对于结果集中的给定记录,debtor 表中的 _noteid 值是否与 note 表中的 debtors 匹配。您可以将查询改写如下:

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 允许布尔表达式作为值的优势。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多