【问题标题】:Show 2 count in 1 result在 1 个结果中显示 2 个计数
【发布时间】:2014-04-09 03:02:33
【问题描述】:

我需要显示一个结果以便提取它。

这是我的名为“TRY”的表

id | type |
01 |  A   |
01 |  D   |
01 |  A   |

我的查询是这样的:

select 
    lpad(id,2,'0')||
    lpad(count(case when type = 'A' then 1 end),3,'0')||
    lpad(count(case when type = 'D' then 1 end),3,'0')||
    lpad(count(case when type in ('A','D') then 1 end),3,'0') then 1 end)
    as results 
from 
    TRY 
group by 
    id
    ,type

我希望结果显示像这样 01002001003 但我得到了 2 个这样的结果 0100200000201000001001。我只想将计数结果合并为一个。

【问题讨论】:

  • 您确定这是您的查询吗?这个查询会给你语法错误。

标签: sql oracle plsql


【解决方案1】:

我认为您需要考虑的主要问题是 GROUP BY clause 的实际工作方式,因为您实际上已按 idtype 分组,这意味着您永远不会对类型 A 和在同一行键入 D,因为它们没有组合在一起。

在您的示例中,我注意到以下内容并处理了这些参数:

  • 你想GROUP BY id(不是GROUP BY id, type
  • 您返回的结果是一个串联的字符串,其中包括
    • id(填充为 2 个字符)
    • 类型 A 的数量(填充为 3 个字符)
    • 类型 D 的数量(填充为 3 个字符)
    • A 和 D 的总和。 (填充为 3 个字符)

您实际上还想使用SUM function 而不是COUNT,因此以下内容应该可以工作:

Oracle/PLSQL

SELECT
    LPAD(id,2,'0')
    || LPAD(SUM(CASE WHEN type = 'A' THEN 1 ELSE 0 END),3,'0')
    || LPAD(SUM(CASE WHEN type = 'A' THEN 1 ELSE 0 END),3,'0')
    || LPAD(SUM(CASE WHEN type = 'A' OR type = 'D' THEN 1 ELSE 0 END),3,'0')
    AS results
FROM
    TRY
GROUP BY
    id

如果您实际上在使用 SQL Server 或其他数据库引擎,LPAD 函数实际上将不起作用,因此使用以下内容可能会起作用。 (如果一些非 ORACLE 用户也有类似的困惑,我也会用它来解决你的问题)

SELECT
    [results] = 
        RIGHT('00' + CONVERT(VARCHAR,[id]),2)
        + RIGHT('000' + CONVERT(VARCHAR,SUM(CASE WHEN [type] = 'A' THEN 1 ELSE 0 END)),3)
        + RIGHT('000' + CONVERT(VARCHAR,SUM(CASE WHEN [type] = 'D' THEN 1 ELSE 0 END)),3)
        + RIGHT('000' + CONVERT(VARCHAR,SUM(CASE WHEN [type] = 'A' OR type = 'D' THEN 1 ELSE 0 END)),3)
FROM
    [TRY]
GROUP BY
    [id]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-20
    • 2013-04-13
    • 1970-01-01
    • 2017-02-17
    • 2021-04-12
    • 2017-11-04
    • 2019-07-10
    • 1970-01-01
    相关资源
    最近更新 更多