Crosstab 查询 Postgres 中的 Duplicate Category Name 错误 42710

Duplicate Category Name Error 42710 in Crosstab query Postgres

我很难执行交叉表查询。当我 运行 以下查询时,我不断收到“重复类别名称错误 42710”。

SELECT
    *
FROM
    crosstab (
        $$
        Select
            date_year,
            city_size,
            sum(Total_Rev)
        From
            (
                SELECT
                    EXTRACT(YEAR FROM SOLD.DATE) Date_Year,
                    CASE WHEN CITY.POPULATION < 3700000 THEN 'SMALL' WHEN CITY.POPULATION >= 3700000
                    AND CITY.POPULATION < 6700000 THEN 'MEDIUM' WHEN CITY.POPULATION >= 6700000
                    AND CITY.POPULATION < 9000000 THEN 'LARGE' WHEN CITY.POPULATION >= 9000000 THEN 'X_LARGE' END City_Size,
                    CASE WHEN DISCOUNT_ON.DISCOUNT_PERCENTAGE IS NOT NULL THEN (
                        (DISCOUNT_ON.DISCOUNT_PERCENTAGE / 100) * PRODUCT.RETAIL_PRICE
                    ) * SOLD.QUANTITY WHEN DISCOUNT_ON.DISCOUNT_PERCENTAGE IS NULL THEN PRODUCT.RETAIL_PRICE * SOLD.QUANTITY END Total_Rev
                FROM
                    SOLD,
                    STORE,
                    CITY,
                    DISCOUNT_ON,
                    PRODUCT
                WHERE
                    CITY.CITY_NAME = STORE.CITY_NAME
                    AND SOLD.PID = PRODUCT.PID
                    AND SOLD.PID = DISCOUNT_ON.PID
                    AND SOLD.DATE = DISCOUNT_ON.DATE
                    AND STORE.STORE_NUMBER = SOLD.STORE_NUMBER
            ) tbl1
        group by
            date_year,city_size
        order by
            date_year,city_size $$,
            $$
        SELECT
            CASE WHEN CITY.POPULATION < 3700000 THEN 'SMALL' WHEN CITY.POPULATION >= 6700000
            AND CITY.POPULATION < 9000000 THEN 'LARGE' END City_Size
        FROM
            CITY $$
    ) AS FINAL_RESULT(date_year Numeric,"SMALL" REAL,"MEDIUM" REAL,"LARGE" REAL,"X_LARGE" REAL );

当我 运行 子查询时,我确实得到了结果:

[子查询结果的图像]

谢谢

使用过滤聚合通常比使用 crosstab() 函数更容易处理:

select date_year,
       sum(Total_Rev) filter (where city_size = 'SMALL') as small,
       sum(Total_Rev) filter (where city_size = 'MEDIUM') as medium,
       sum(Total_Rev) filter (where city_size = 'LARGE') as large,
       sum(Total_Rev) filter (where city_size = 'X_LARGE') as x_large
from (
  SELECT EXTRACT(YEAR FROM SOLD.DATE) Date_Year,
         CASE 
           WHEN city.population < 3700000 THEN 'SMALL' 
           WHEN city.population >= 3700000 AND city.population < 6700000 then 'MEDIUM' 
           WHEN city.population >= 6700000 AND city.population < 9000000 then 'LARGE' 
           WHEN city.population >= 9000000 THEN 'X_LARGE' 
          END city_size,
          CASE 
             WHEN DISCOUNT_ON.DISCOUNT_PERCENTAGE IS NOT NULL 
               THEN ((DISCOUNT_ON.DISCOUNT_PERCENTAGE / 100) * PRODUCT.RETAIL_PRICE) * SOLD.QUANTITY 
             WHEN DISCOUNT_ON.DISCOUNT_PERCENTAGE IS NULL 
               THEN PRODUCT.RETAIL_PRICE * SOLD.QUANTITY 
           END total_rev
  FROM sold 
    JOIN store ON store.store_number = sold.store_number
    JOIN city ON city.city_name = store.city_name
    JOIN discount_on ON sold.pid = discount_on.pid AND sold.date = discount_on.date
    JOIN product ON sold.pid = product.pid
) tbl1
group by date_year,city_size
order by date_year,city_size