首页 > 解决方案 > 透视子句中的 Oracle 计数值

问题描述

我有下表:

ID 抽签 PROID 储物柜
XXXXXX 06 01
XXXXXX 06 02 X
XXXXXX 06 02 小号
XXXXXX 06 01 R
XXXXXX 02 01
XXXXXX 02 02 X
XXXXXX 02 02 小号
XXXXXX 02 01 R
XXXXXX 02 01 R
XXXXXX 02 01 R
XXXXXX 02 01 R
年年年年 06 01
年年年年 06 02 X
年年年年 06 02 小号
年年年年 06 01 R
年年年年 02 01
年年年年 02 02 X
年年年年 02 02 小号
年年年年 02 01 R

如果我运行以下查询,它会给出以下内容

SELECT *
  FROM
  (
    SELECT id,lotyp||proid As title,
           LISTAGG(lockr,',') WITHIN GROUP (ORDER BY lotyp||proid) AS value
      FROM t
     GROUP BY id,lotyp||proid )
 PIVOT (
         MAX(value) FOR title IN ('0201' AS "0201",
                                  '0202' AS "0202",
                                  '0601' AS "0601",
                                  '0602' AS "0602"))   
 ORDER BY id;
ID 0201 0202 0601 0602
XXXXXX R,R,R,R,Y S, X R, Y S, X
年年年年 R, Y S, X R, Y S, X

但是,我怎样才能获得以下内容?

ID 0201 0202 0601 0602
XXXXXX 4R, Y S, X R, Y S, X
年年年年 R, Y S, X R, Y S, X

标签: sqloracle

解决方案


先数一数

SELECT *
FROM(
    SELECT id, title,
           LISTAGG(lockr,',') WITHIN GROUP (ORDER BY title) AS value
    FROM(
       SELECT id,lotyp||proid As title, case count(*) when 1 then '' else CAST(count(*) AS VARCHAR2(10)) end || LOCKR As LOCKR
       FROM  t
       GROUP BY id,lotyp||proid, LOCKR
   ) t
GROUP BY id, title )
PIVOT (
         MAX(value) FOR title IN ('0201' AS "0201",
                                  '0202' AS "0202",
                                  '0601' AS "0601",
                                  '0602' AS "0602"))   
ORDER BY id; 

推荐阅读