I have the following columns
date | id | score |
score
has options like offered
, good
, and bad
.
How to write a query that gives the number of ratings offered vs. the number of queries provided (score is either good
or bad
) per day.
CodePudding user response:
I'm not entire clear what output you want from this, but I think you are looking for something like the following?
SELECT t1.date, t1.all, t2.offered
FROM (SELECT date_trunc('day', date) "date", count(*) "all"
FROM test
GROUP BY 1) t1
JOIN (SELECT date_trunc('day', date) "date", count(*) "offered"
FROM test
WHERE score = 'offered'
GROUP BY 1) t2
ON t1.date = t2.date;
This will group by the date, and output the total rows per date, and total rows with a "score" of 'offered' per date. Here's a fiddle of this running
CodePudding user response:
SELECT
SUM(
CASE
WHEN score IN ('good', 'bad') THEN 1
ELSE 0
END
) AS good_or_bad
SUM(
CASE
WHEN score = 'offered' THEN 1
ELSE 0
END
) AS offered
FROM yourtable
GROUP BY date
In the above, I'm using case-when
to determine the score
. The first field is for good_or_bad
, so I'm counting the elements where the score is either good or bad. The second is for offered
, so I'm counting the records whose score
is offered. Since you want to group by
date
, that's added as well
NOTE
date
might be a varchar
, a date
or a timestamp
. In my query above I assumed that date
is of day precision. If it's like a timestamp
, then you will need to modify the group by
to extract the actual date.