首页 > 解决方案 > 如何构建此 Oracle SQL 查询

问题描述

我需要检索由“”分隔的“CARGO#”的名称或名称,由“PNTO_VNTA”过滤

我需要这样的输出:

我需要这种方式的输出

我做了很多测试,但他们以这种方式给我带来了结果:

我做了很多测试,但他们以这种方式给我带来了结果

这是我正在使用的代码

 SELECT
    s.PNTO_VNTA,
    LISTAGG (g.CARGO), ', ') WITHIN GROUP (ORDER BY g.CARGO) OVER()  PRODUCTOS
FROM
    PNTOS_VNTA s,
    CARGOS g
WHERE
    s.crgo = g.CARGO
    AND s.PNTO_VNTA = 12345
    GROUP BY s.PNTO_VNTA,
    g.cargo
    ;

标签: sqloraclelistagg

解决方案


您同时按pnto_vntaand分组cargo,因此每个组合都会得到一行;然后聚合将只有一个值。您似乎试图通过添加over()子句来使listagg()呼叫分析来弥补这一点。

如果你改变这两个你应该得到你想要的:

SELECT
    s.PNTO_VNTA,
    LISTAGG (g.CARGO, ', ') WITHIN GROUP (ORDER BY g.CARGO) PRODUCTOS
FROM
    PNTOS_VNTA s,
    CARGOS g
WHERE
    s.crgo = g.CARGO
    AND s.PNTO_VNTA = 12345
    GROUP BY s.PNTO_VNTA
    ;

或者使用 ANSI 连接语法:

SELECT
    s.PNTO_VNTA,
    LISTAGG (g.CARGO, ', ') WITHIN GROUP (ORDER BY g.CARGO) PRODUCTOS
FROM PNTOS_VNTA s
JOIN CARGOS g ON s.crgo = g.CARGO
WHERE s.PNTO_VNTA = 12345
GROUP BY s.PNTO_VNTA
;

虽然看起来你不需要加入;除非您有空值或孤儿,否则您可能可以这样做:

SELECT
    s.PNTO_VNTA,
    LISTAGG (s.CRGO, ', ') WITHIN GROUP (ORDER BY s.CRGO) PRODUCTOS
FROM PNTOS_VNTA s
WHERE s.PNTO_VNTA = 12345
GROUP BY s.PNTO_VNTA
;

db<>小提琴

(我已经留下s.crgo了所有这些;不确定这是否是您问题中的错字。)


推荐阅读