代码之家  ›  专栏  ›  技术社区  ›  roca

试图让CTE在PostgreSQL中工作

  •  0
  • roca  · 技术社区  · 3 年前

    我是SQL新手,我尝试在PostreSQL上进行递归查询,但没有任何运气。

    我有一个tb\U invoice表,其中包含以下列:

    发票编号 客户编号 已付款 总计金额
    “F0000C000400200” “C0004” “Y” 28786.7
    “F0000C000400201” “C0004” “N” 5624.29
    “F0000C000400202” “C0004” “Y” 25675.54
    “F0000C000400203” “C0004” “Y” 35479.72
    “F0000C000400207” “C0004” “Y” 23497.47
    “F0000C000500212” “C0005” “N” 14754.03
    “F0000C000500213” “C0005” “N” 3073.5

    我想做一个递归CTE,为每个客户编号在一行上获取大于28.000欧元的未付款发票,并为发票数量排序结果。它应该是这样的(在nombre\u cliente列中应该显示cust\u no)。

    enter image description here

    但我无法完成代码。我尝试了多种方法,但它总是返回具有重复值的行,或者每行只返回一张发票。

    这是我尝试过的一些代码。我知道我的错误在于我在工会条款中给出的条件,但我无法找到解决方案。。。

        WITH RECURSIVE lista_facturas AS (
        SELECT
            cust_no,
            ROW_NUMBER() OVER (PARTITION BY cust_no) AS numero_fila,
            COUNT(*) OVER (PARTITION BY cust_no) AS max_numero_fila,
            CAST (invoice_no AS TEXT) AS resultado
        FROM 
            factura_cliente
    -- I have tried to add multiple WHERE clauses, but they all fail...
        UNION ALL
        SELECT
            f.cust_no,
            ROW_NUMBER() OVER (PARTITION BY f.cust_no) AS numero_fila,
            COUNT(*) OVER (PARTITION BY f.cust_no) AS max_numero_fila,
            CAST (l.resultado || ',' || f.invoice_no AS TEXT) AS resultado
        FROM
            factura_cliente f INNER JOIN lista_facturas l
                ON (l.cust_no = f.cust_no
                   AND f.numero_fila = l.numero_fila + 1
                   AND f.numero_fila <= l.max_numero_fila)
    
        -- Here I also tried 'l.invoice_no <> f.invoice_no' and other combinations
    ), factura_cliente AS(
        SELECT
            cust_no,
            invoice_no,
            ROW_NUMBER() OVER (PARTITION BY cust_no) AS numero_fila,
            COUNT(*) OVER (PARTITION BY cust_no) AS max_numero_fila
        FROM erp.tb_invoice i
        WHERE payed = 'N'
            AND tot_amount > 28000
    )
    SELECT 
        cust_no,
        resultado
    FROM
        lista_facturas
    ;
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   Kadet    3 年前

    使用 STRING_AGG 函数创建分开的发票列表。

    SELECT 
      cust_no, 
      STRING_AGG(invoice_no,',' ORDER BY invoice_no) invoice_list  
    FROM tb_invoice
    WHERE payed = 'N'
          AND tot_amount > 28000
    GROUP BY cust_no;