2013-07-09 63 views
2

我正在編寫一份報告,顯示自過去一年以來每個月的代碼總量。將列名稱顯示爲從current_date開始的過去一年的月份

目前,如果我只是做一個計數所有代碼在過去的一年裏,然後我的結果集類似這樣

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 

上面的代碼是我期待的,但什麼,我想現在要做的,就是爲了通過當月的一切,然後再一年,自認爲當月的結果。

因此,如果當前的月份是七月那麼我的結果集將被責令這樣

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 
+2

您忘了提供Postgres版本,您的表格定義,您當前的查詢(是否工作)以及一些示例數據。 –

回答

1

你想crosstab(),通過附加模塊提供tablefunc

假設「日期」類型爲date(它應該是這樣)。
其他細節取決於你忘記提供的細節。

SELECT * FROM crosstab(
    $$SELECT name, code, to_char("date", 'mon'), total 
     FROM tbl 
     WHERE "date" < now() 
     AND "date" >= now() - interval '1 year' 
     ORDER BY name, extract(month from now()) DESC$$ 

    ,$$VALUES 
     ('dec'::text), ('nov'), ('oct'), ('sep'), ('aug'), ('jul') 
    , ('jun'),  ('may'), ('apr'), ('mar'), ('feb'), ('jan')$$ 
    ) 
AS ct (name text, code text 
    , dec int, nov int, oct int, sep int, aug int, jul int 
    , jun int, may int, apr int, mar int, feb int, jan int); 

請參閱本密切相關答案的附加說明:
Sum by month and put months as columns

你不應該使用date作爲標識符,它是一個保留字。我雙引號。
您不應該使用非描述性名稱name

+0

我以前使用過交叉表,但它沒有工作。我在上面列出了我的查詢,向您展示我如何使用案例陳述。即使我會使用交叉表,它仍然不是我正在尋找的。 這些列仍然是靜態的,我正在尋找一份滾動月份報告。所以當前的月份會先顯示,然後是其他月份。這也會隨着月份的變化而改變。 –

+0

@norski_lab:您仍然忘記了表定義(psql中的'\ d tbl';包含相關列及其數據類型)和樣本數據。 crosstab()應該可以正常工作。動態列很難得到。我的例子在沒有任何價值的月份提供NULL。 –