Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

fetching monthwise data from a database with a year's record in postgres

Tags:

sql

postgresql

I am having a table with a years data with the following columns:

Table "myData" ((
    "Status" character varying,  
    "Project" character varying,  
    "Product" character varying, 
    "Identifier" character varying, 
    "Submittedon" date
    )

etc.,

Now to fetch a count of records submitted on a particular month. Say like April 2013's Record count, I am using:

select count("Status") as April2013 
from "myData"  
where (
    "SubmittedOn" > (current_date - 90) 
    and "SubmittedOn" < (current_date - 60)
)

Result:

April2013
--------
62

Now my requirement is to fetch the count of records for the past 6 months. I mean i want my output in any of the below formats:

FORMAT 1:

enter image description here

FORMAT 2:

6MonthsCount
-------------
34

23

44

41

18

9
like image 860
Deepak Avatar asked Feb 17 '23 06:02

Deepak


2 Answers

select
    date_trunc('month', submittedOn) "month",
    count("Status") total
from "myData"  
group by 1
order by 1
like image 119
Clodoaldo Neto Avatar answered Mar 23 '23 01:03

Clodoaldo Neto


This looks like a "Pivot"-Table so use the crosstab() function of the tablefunc extention (http://www.postgresql.org/docs/current/static/tablefunc.html):

CREATE TABLE mydata (status text, submitteton date);
INSERT INTO mydata VALUES ('a', '2013-01-02'), ('b', '2013-01-05'), ('c', '2013-02-09'), ('d', '2013-04-11');


SELECT extract(month from submitteton) as month, count(*) FROM mydata GROUP BY month;
 month | count 
-------+-------
     1 |     2
     2 |     1
     4 |     1

CREATE EXTENSION tablefunc;
SELECT 
  *
FROM 
  crosstab(
    'SELECT 
       extract(year from submitteton)::int as year,
       extract(month from submitteton) as month, 
       count(*)::int 
     FROM
       mydata 
     GROUP BY 1,2 
     ORDER BY 1,2', 

     'SELECT * FROM generate_series(1, 12)'
  ) as ct(
    year int,
    jan int, feb int, mar int, apr int, may int, jun int, 
    jul int, aug int, sep int, oct int, nov int, dec int
  )
ORDER BY 
  year
;

 year | jan | feb | mar | apr | may | jun | jul | aug | sep | oct | nov | dec 
------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----
 2013 |   2 |   1 |     |   1 |     |     |     |     |     |     |     |    
like image 27
lathspell Avatar answered Mar 23 '23 00:03

lathspell