Sql pivot子句中的Oracle计数值

Sql pivot子句中的Oracle计数值,sql,oracle,Sql,Oracle,我有下表: 身份证件 洛蒂普 PROID 储物柜 XXXXX 06 01 Y XXXXX 06 02 X XXXXX 06 02 s XXXXX 06 01 R XXXXX 02 01 Y XXXXX 02 02 X XXXXX 02 02 s XXXXX 02 01 R XXXXX 02 01 R XXXXX 02 01 R XXXXX 02 01 R YYYY 06 01 Y YYYY 06 02 X YYYY 06 02 s YYYY 06 01 R YYYY 02 01 Y YYYY 0

我有下表:

身份证件 洛蒂普 PROID 储物柜 XXXXX 06 01 Y XXXXX 06 02 X XXXXX 06 02 s XXXXX 06 01 R XXXXX 02 01 Y XXXXX 02 02 X XXXXX 02 02 s XXXXX 02 01 R XXXXX 02 01 R XXXXX 02 01 R XXXXX 02 01 R YYYY 06 01 Y YYYY 06 02 X YYYY 06 02 s YYYY 06 01 R YYYY 02 01 Y YYYY 02 02 X YYYY 02 02 s YYYY 02 01 R 先数一数

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; 
先数一数

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; 

使用CTE而不是内联查询发布Serg接受的答案

WITH aux AS (
    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
), aux2 AS (
    SELECT
        id,
        title,
        LISTAGG(lockr, ',') WITHIN GROUP(
            ORDER BY
                title
        ) AS value
    FROM
        aux
    GROUP BY
        id,
        title
)
SELECT
    *
FROM
    aux2 PIVOT (
        MAX ( value )
        FOR title
        IN ( '0201' AS "0201", '0204' AS "0204", '0209' AS "0209", '0210' AS "0210", '0601' AS "0601", '0602' AS "0602", '0603' AS
        "0603", '0604' AS "0604", '0605' AS "0605", '0609' AS "0609", '0610' AS "0610", '0612' AS "0612", '4101' AS "4101", '4102'
        AS "4102", '4105' AS "4105", '4112' AS "4112" )
    )

使用CTE而不是内联查询发布Serg接受的答案

WITH aux AS (
    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
), aux2 AS (
    SELECT
        id,
        title,
        LISTAGG(lockr, ',') WITHIN GROUP(
            ORDER BY
                title
        ) AS value
    FROM
        aux
    GROUP BY
        id,
        title
)
SELECT
    *
FROM
    aux2 PIVOT (
        MAX ( value )
        FOR title
        IN ( '0201' AS "0201", '0204' AS "0204", '0209' AS "0209", '0210' AS "0210", '0601' AS "0601", '0602' AS "0602", '0603' AS
        "0603", '0604' AS "0604", '0605' AS "0605", '0609' AS "0609", '0610' AS "0610", '0612' AS "0612", '4101' AS "4101", '4102'
        AS "4102", '4105' AS "4105", '4112' AS "4112" )
    )