2

昨年からの各月のコードの合計量を示すレポートを書いています。

現在、過去 1 年間のすべてのコードをカウントすると、結果セットは次のようになります。

name    | code  | total   |  date
build1    x1      10        04-2013
build1    x50     60        05-2013
build1    x1      80        06-2013
build1    x90     450       07-2013

すべての列が月になり、その下に合計が表示されるように、すべての行を転置することができました。更新された結果は次のようになります

name    |  code | apl |  may | jun | jul
build1     x1      10    0     80     0
build1     x50     0     60     0     0
build1     x90     0     0      0     450   

上記のコードは私が探している結果ですが、私が今やりたいことは、今月までにすべてを注文し、その月から 1 年さかのぼることです。

したがって、現在の月が 7 月の場合、結果セットは次のように並べられます。

name    |  code | jul |  jun | may | apl
build1     x1      0     80     0     10
build1     x50     0      0     60     0
build1     x90     450    0     0      0 

月の名前としてエイリアスを使用しているという問題が発生しています。また、エイリアスから月を取得することはできません。また、私の知る限り、エイリアスは静的であるため、一度設定すると変更できません。月を列名として取得する唯一の方法は、データ セットから月を抽出することです。しかし、行を列に転置するときは、case ステートメントを使用して各月のすべての合計を取得しているため、エイリアスを使用する必要があります。

編集: 申し訳ありませんが、postgresql のバージョンは 8.4 です。

SELECT 


pname,
code,
SUM(totaljanurary)  AS "Janurary",
SUM(totalfebruary)  AS "February",
SUM(totalmarch)     AS "March",
SUM(totalapril)     AS "April",
SUM(totalmay)       AS "May",
SUM(totaljune)      AS "June",
SUM(totaljuly)      AS "July",
SUM(totalaugust)    AS "August",
SUM(totalseptember) AS "September",
SUM(totaloctober)   AS "October",
SUM(totalnovember)  AS "November",
SUM(totaldecember)  AS "December"

FROM(

SELECT 

    pname,
    code,
    SUM(case when extract (month FROM checked_date)=01 then total else 0 end) AS totaljanurary,
    SUM(case when extract (month FROM checked_date)=02 then total else 0 end) AS totalfebruary,
    SUM(case when extract (month FROM checked_date)=03 then total else 0 end) AS totalmarch,
    SUM(case when extract (month FROM checked_date)=04 then total else 0 end) AS totalapril,
    SUM(case when extract (month FROM checked_date)=05 then total else 0 end) AS totalmay,
    SUM(case when extract (month FROM checked_date)=06 then total else 0 end) AS totaljune,
    SUM(case when extract (month FROM checked_date)=07 then total else 0 end) AS totaljuly,
    SUM(case when extract (month FROM checked_date)=08 then total else 0 end) AS totalaugust,
    SUM(case when extract (month FROM checked_date)=09 then total else 0 end) AS totalseptember,
    SUM(case when extract (month FROM checked_date)=10 then total else 0 end) AS totaloctober,
    SUM(case when extract (month FROM checked_date)=11 then total else 0 end) AS totalnovember,
    SUM(case when extract (month FROM checked_date)=12 then total else 0 end) AS totaldecember



    FROM (

        --START HERE
        SELECT

            pname,
            code,
            COUNT(code)AS total,
            date_trunc('month',checked_date)::date AS checked_date


            FROM table1

            AND checked_date >= current_date-365
            AND checked_date <= current_date


            GROUP BY pname, code, date_trunc('month',checked_date)
    )T1
    GROUP BY pname, code, date_trunc('month',checked_date)

)T2
GROUP BY pname, code
ORDER BY pname, code
4

1 に答える 1