Sql pivot子句中的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 02 02 X YYYY 02 02 s YYYY 02 01 R 先数一数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
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" )
)