在1个结果中显示2个计数

时间:2014-04-09 03:02:33

标签: sql oracle plsql

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

这是我的名为' 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。我只想把计数结果合二为一。

1 个答案:

答案 0 :(得分:0)

我认为你需要考虑的主要问题是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]
相关问题