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
Related
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
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%')
************************************************
* id * location * status *
************************************************
* 1 * Shah Alam, Selangor * 1 *
* 2 * Seri Kembangan, Selangor * 1 *
************************************************
Hello guys, i have this kind of table in my database. Which in the location field, there is state. As you see, in the current field is Selangor.
How do i group it by Selangor and count it? I'm not sure whether using substr in mysql query is better or not. I do have an array which i think also possible to use to group and count.
$negeri = array('Selangor','Kedah','Johor','Negeri Sembilan','Perlis','Perak','Sarawak','Sabah','Kuala Lumpur','Kelantan','Terengganu','Melaka','Pahang','Pulau Pinang');
If i am about to use this array solution, how do i do it? Thanks
try this sql query,
select count(location) as locCount from state where location LIKE '%Selangor%' group by location;
in PHP
$sql = "select count(location) as locCount from state where location LIKE '%".$negeri[0]."%' group by location;";
Replace $negeri[0] with your variable name in php
EDIT: TO CREATE SQL QUERY IN LOOP TRY THIS CODE
as per #massquote's code, you can create a sql query in loop like below,
$negeri = array('Selangor','Kedah','Johor','Negeri Sembilan','Perlis','Perak','Sarawak','Sabah','Kuala Lumpur','Kelantan','Terengganu','Melaka','Pahang','Pulau Pinang');
$sql = "SELECT ";
$i=1;
$totCount = count($negeri);
foreach($negeri as $place){
$sql .= "SUM(CASE WHEN location LIKE '%".$place."%' THEN 1 ELSE 0 END) as place".$i;
if($i != $totCount) {
$sql .=", ";
}
$i++;
}
$sql .= " FROM state;";
echo $sql;
echo $sql will print the below sql query, you can use final $sql variable as sql query.
SELECT
SUM(CASE WHEN location LIKE '%Selangor%' THEN 1 ELSE 0 END) as place1,
SUM(CASE WHEN location LIKE '%Kedah%' THEN 1 ELSE 0 END) as place2,
SUM(CASE WHEN location LIKE '%Johor%' THEN 1 ELSE 0 END) as place3,
SUM(CASE WHEN location LIKE '%Negeri Sembilan%' THEN 1 ELSE 0 END) as place4,
SUM(CASE WHEN location LIKE '%Perlis%' THEN 1 ELSE 0 END) as place5,
SUM(CASE WHEN location LIKE '%Perak%' THEN 1 ELSE 0 END) as place6,
SUM(CASE WHEN location LIKE '%Sarawak%' THEN 1 ELSE 0 END) as place7,
SUM(CASE WHEN location LIKE '%Sabah%' THEN 1 ELSE 0 END) as place8,
SUM(CASE WHEN location LIKE '%Kuala Lumpur%' THEN 1 ELSE 0 END) as place9,
SUM(CASE WHEN location LIKE '%Kelantan%' THEN 1 ELSE 0 END) as place10,
SUM(CASE WHEN location LIKE '%Terengganu%' THEN 1 ELSE 0 END) as place11,
SUM(CASE WHEN location LIKE '%Melaka%' THEN 1 ELSE 0 END) as place12,
SUM(CASE WHEN location LIKE '%Pahang%' THEN 1 ELSE 0 END) as place13,
SUM(CASE WHEN location LIKE '%Pulau Pinang%' THEN 1 ELSE 0 END) as place14
FROM state;
You can do something like this.
SELECT 'Selangor' as state,
SUM(CASE WHEN location like '%, Selangor%' then 1 Else 0 end) AS cnt from yourtable
UNION ALL
SELECT 'Kedah' as state,
SUM(CASE WHEN location like '%, Kedah%' then 1 Else 0 end) AS cnt from yourtable;
Just generate the sql using loop in php then execute the script.
It confuses me.. total left calculation seems doesn't work.
I am trying to get the total voucher and get total used and the total left.
please help.
SELECT
(IFNULL(SUM(value), 0)) AS total_voucher,
(
SELECT
IFNULL(SUM(value), 0))
FROM
voucher_history
WHERE
idUser = 1 AND isUsed = 1 AND DATE(FROM_UNIXTIME(datetime)) = '2014-03-04'
) AS total_used,
(total_voucher-total_used) AS total_left
FROM
voucher_history
WHERE
idUser = 1 AND isUsed = 0 AND DATE(FROM_UNIXTIME(datetime)) <= '2014-03-05'
You can do this with conditional aggregation, rather than using a subquery:
SELECT coalesce(SUM(value), 0)) AS total_voucher,
sum(case when is_used = 1 then value else 0 end) as total_used,
sum(case when is_used = 1 then 0 else value end) as total_left
FROM voucher_history
WHERE idUser = 1 AND DATE(FROM_UNIXTIME(datetime)) <= '2014-03-05';
Your query has the problem that it is trying to use column aliases (total_voucher and total_used) in the same select statement. SQL does not support this. You would need to use a subquery to get that functionality.
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 :)