Make multiple counts then sum it in one query - php

I'm seeking for solution on how to get count for 3 faculty code then sum all the count in one variable. I didn't found the right query to combine the count and then sum it.
This is the code that I have:
SELECT COUNT(CASE WHEN `fac_code` LIKE '%JABPN%' THEN 1 END) AS count1,
COUNT(CASE WHEN `fac_code` LIKE '%JABFNT%' THEN 1 END) AS count2,
COUNT(CASE WHEN `fac_code` LIKE '%FPKF%' THEN 1 END) AS count3
FROM `list_faculty` WHERE active = 'Y';
And the output that I got:
count1
count2
count3
69
184
36
The output that I need is the sum of all the count which is 289

How about adding this?
COUNT(CASE WHEN fac_code LIKE '%FPKF%' OR fac_code LIKE %JABFNT%' OR fac_code LIKE '%JABPN%' THEN 1 END)
SQL doesn't allow you to use aliases in the same SELECT, so the alternative would be a CTE or subquery.

You can combine these three counts in one condition of case .. when or you can use + between them as follows:
SELECT COUNT(CASE WHEN `fac_code` LIKE '%JABPN%'
OR `fac_code` LIKE '%JABFNT%'
OR `fac_code` LIKE '%FPKF%'
THEN 1 END) AS count1_3
FROM `list_faculty` WHERE active = 'Y';
OR you can use + between them as follows:
SELECT COUNT(CASE WHEN `fac_code` LIKE '%JABPN%' THEN 1 END) +
COUNT(CASE WHEN `fac_code` LIKE '%JABFNT%' THEN 1 END) +
COUNT(CASE WHEN `fac_code` LIKE '%FPKF%' THEN 1 END) AS count1_3
FROM `list_faculty` WHERE active = 'Y';
And the best way in your case is to use condition in WHERE clause as follows:
SELECT COUNT(*)
FROM `list_faculty`
WHERE active = 'Y'
AND (`fac_code` LIKE '%JABPN%'
OR `fac_code` LIKE '%JABFNT%'
OR `fac_code` LIKE '%FPKF%')

Related

group by comparing 2 columns

I'm not very good at MySQL. I don't know how to do the following result. I would be grateful if you help
SELECT
skill ,
COUNT(*),
COUNT(CASE WHEN answer = 'A' THEN 1 END) AS _TRUE,
COUNT(CASE WHEN answer <> 'B' OR answer <> 'C' THEN 1 END) AS _FALSE
FROM tbl_skill_and_answer
WHERE skill = "Text Types"
GROUP BY skill
How can I do this in mysql-php?
My table is as below
My Table
RESULT
The asker resolved the issue with the following query (no explanation given):
SELECT
skill,
COUNT(*),
COUNT(CASE WHEN answer= result THEN 1 END) AS _TRUE,
COUNT(CASE WHEN answer<> result THEN 1 END) AS _FALSE
COUNT(CASE WHEN answer IS NULL THEN 1 END) AS _EMPTY
FROM tbl_skill_and_answer
WHERE skill= "Text Types"
GROUP BY skill

how can i select data and sub query group by

When i select data only show first lot data . but i need all lot data.
Here is my query:
SELECT lot,
(select count(pass) FROM pass_fail_result where pass=0) toatl_fail,
(select count(pass) FROM pass_fail_result where pass=1) toatl_pass FROM pass_fail_result group by lot;
I want to show all pass result like pass=10 and fail=2
The easiest way to do this is via conditional aggregation, where we count or sum CASE expressions which target the failing or passing records:
SELECT
lot,
COUNT(CASE WHEN pass = 0 THEN 1 END) AS toatl_fail,
COUNT(CASE WHEN pass = 1 THEN 1 END) AS toatl_pass
FROM pass_fail_result
GROUP BY
lot;

Getting Count with different conditions in Select Query

The scenario is I have a column named "States" in a table, States can be 0,1,2,3 or 4. What I want to do is get a count of each state using WHERE State = in a single query.
The main purpose is I want to show the count of records (identified by their state). Like this, 20 records have State 0 etc.
Is this possible? If yes, then how can I achieve this?
Edit: I know about Count. Here's what I have tried:
SELECT State, Date_Created, (SELECT COUNT(Id) FROM [ECOS].[eco].[tb_projects_details] WHERE State=1) as State_One, (SELECT COUNT(Id) FROM [ECOS].[eco].[tb_projects_details] WHERE State=2) as State_Two, (SELECT COUNT(Id) FROM [ECOS].[eco].[tb_projects_details] WHERE State=0) as State_Zero, (SELECT COUNT(Id) FROM [ECOS].[eco].[tb_projects_details] WHERE State=4) as State_Four FROM [ECOS].[eco].[tb_projects_details] WHERE Date_Created < dateadd(week,-3,getdate());
If I understand it correctly, you want to group and count:
SELECT mt.States, COUNT(*) total
FROM my_table mt
GROUP BY mt.States
To generate a list of values and their counts you can do this:
SELECT State, COUNT(*) AS C
FROM mytable
GROUP BY State
To generate one row that contains value counts as columns you can do this:
SELECT
COUNT(CASE State WHEN 0 THEN 1 ELSE NULL END) AS State_0_Count,
COUNT(CASE State WHEN 1 THEN 1 ELSE NULL END) AS State_1_Count,
COUNT(CASE State WHEN 2 THEN 1 ELSE NULL END) AS State_2_Count,
COUNT(CASE State WHEN 3 THEN 1 ELSE NULL END) AS State_3_Count,
COUNT(CASE State WHEN 4 THEN 1 ELSE NULL END) AS State_4_Count
FROM [...]
WHERE [...]
It will be very easy if you use group by clause after where condition. Then you will get the number of each state very easily.
SELECT state, count(*)
FROM table_name
GROUP BY state
Next time read a sql for beginers book first.
Select state, count(*)
from table
group by state

MySQL pivot with multiple counts

This is a snapshot of my MySQL table:
Is it possible to write a query to get such a pivot table like output...
How about something like
SELECT url_host,
SUM(CASE WHEN post_id = -1 THEN 1 ELSE 0 END) as post_id_minus1,
SUM(CASE WHEN post_id = 0 THEN 1 ELSE 0 END) as post_id_0,
etc...
FROM YOUR_TABLE
GROUP BY url_host
You can use CASE statement on this to pivot your table.
SELECT url_host,
COUNT(CASE WHEN post_ID = -1 THEN 1 ELSE NULL END) Negative_One,
COUNT(CASE WHEN post_ID = 0 THEN 1 ELSE NULL END) Zero,
COUNT(CASE WHEN post_ID > 0 THEN 1 ELSE NULL END) Greater_Zero
FROM tableName
GROUP BY url_host
SQLFiddle Demo

Group sql query

I want to have an only query with 2 queries but i don't know how to start...
My queries count the positive/negative votes for a comment.
SELECT COUNT(id) AS votes_no FROM comments_votes WHERE vote = 0 AND id_comment = 1
SELECT COUNT(id) AS votes_no FROM comments_votes WHERE vote = 1 AND id_comment = 1
I set vars to put negative and positives votes : $votes_no and $votes_yes
Then i have a final var : $votes_calc = $votes_yes - $votes_no;
How can i get the number of votes_yes, votes_no and votes_calc in only one query?
Thanks a lot!
select votes_no, votes_yes, votes_yes-votes_no as votes_calc
from (select sum(case when vote = 0 then 1 else 0 end) as votes_no,
sum(case when vote = 1 then 1 else 0 end) as votes_yes
from comments_votes
where id_comment = 1) a
select vote,count(id)
from Comment_votes
group by vote
WHERE id_comment = 1
with rollup
The with Rollup will add a row with a NULL value in the vote column and the total in the second column
I merge the query getting the comments and the comments votes and it seems to work :)
SELECT a.*, nb_votes, votes_yes-votes_no AS votes_calc
FROM comments AS a
LEFT JOIN (
SELECT id_comment, COUNT(id) AS nb_votes,
SUM(CASE WHEN vote = 0 THEN 1 ELSE 0 END) AS votes_no,
SUM(CASE WHEN vote = 1 THEN 1 ELSE 0 END) AS votes_yes
FROM comments_votes GROUP BY id_comment
) AS c ON (a.id = c.id_comment)
WHERE a.status = 'approved' AND a.id_post = 1 ORDER BY a.time ASC
Thanks for your answers :)

Categories