Triple SELECT from the same table MySQL - mysql

I'd like to group all these queries within the same table:
SELECT orgname, COUNT(username)
FROM `user`
GROUP BY orgname;
SELECT COUNT(username) AS 'users_with_2FA'
FROM `user`
WHERE two_fa_enabled = 1
GROUP BY orgname;
SELECT COUNT(username) AS 'users_pending_2FA'
FROM `user`
WHERE two_fa_required_date IS NOT NULL AND two_fa_enabled IS NULL
GROUP BY orgname;

Please try this using CASE as suggested by #jarlh
SELECT orgname, COUNT(username) AS 'users_all'
, SUM((CASE WHEN two_fa_enabled = 1 THEN 1 ELSE 0 END)) AS 'users_with_2FA'
, SUM((CASE WHEN (two_fa_required_date IS NOT NULL AND two_fa_enabled IS NULL) THEN 1 ELSE 0 END)) AS 'users_pending_2FA'
FROM `user`
GROUP BY orgname;

Related

order by not working on alias column in mysql query with union all query

SELECT SUM(T1.approve_con) AS compl_rec,
SUM(T1.payout) AS payout,
SUM(T1.reversal) AS reversal,
T1.app_id,
T1.end_user,
T1.created
FROM (
(SELECT app_id,end_user,created,
approve_conversions AS `approve_con`,
'0' AS reversal,
payout AS payout
FROM app_end_users
WHERE publisher_id=1625
AND app_id=57)
UNION ALL
(SELECT opinongold_survey_response.app_id,
opinongold_survey_response.user_id AS end_user,
opinongold_survey_response.movement AS created,
(CASE WHEN opinongold_survey_response.survey_status= 'Completed' THEN 1 ELSE 0 END) AS `approve_con`,
(CASE WHEN opinongold_survey_response.survey_status= 'Rejected' THEN 1 ELSE 0 END) AS reversal,
(CASE WHEN opinongold_survey_response.survey_status= 'Completed' THEN payout ELSE 0 END) AS payout
FROM opinongold_survey_response
WHERE pub_id=1625
AND app_id=57)
) AS T1
GROUP BY T1.app_id,T1.end_user
ORDER BY `approve_con` DESC
LIMIT 0, 10
above is my mysql query order by is not working on approve_con, payout, reversal column
please let me where i am doing wrong in this query.

MYSQL Error code 1248 Every derived table must have it's own alias

MYSQL Error code 1248 Every derived table must have it's own alias
select supplier_id, supplier_name, strong_answers from
(select campaign_suppliers.id supplier_id, campaign_suppliers.supplier_name supplier_name,
count(case when supplier_answers.binary_answer is not null
or supplier_answers.value_answer is not null then 1 end) strong_answers
from supplier_answers join campaign_suppliers on (supplier_answers.supplier_id = campaign_suppliers.id)
where supplier_answers.campaign_id = 1 group by campaign_suppliers.id, campaign_suppliers.supplier_name
having count(case when supplier_answers.binary_answer is not null
or supplier_answers.value_answer is not null then 1 end) >=
(select count(distinct supplier_answers.question_index) from supplier_answers where campaign_id = 1))
where strong_answers >= (select count(distinct supplier_answers.question_index) from supplier_answers where campaign_id = 1)
You need a table name alias for the from ( ... ) t see // <---- symbol below
select t.supplier_id, t.supplier_name, t.strong_answers from (
select campaign_suppliers.id supplier_id, campaign_suppliers.supplier_name supplier_name,
count(case when supplier_answers.binary_answer is not null
or supplier_answers.value_answer is not null then 1 end) strong_answers
from supplier_answers join campaign_suppliers on (supplier_answers.supplier_id = campaign_suppliers.id)
where supplier_answers.campaign_id = 1 group by campaign_suppliers.id, campaign_suppliers.supplier_name
having count(case when supplier_answers.binary_answer is not null
or supplier_answers.value_answer is not null then 1 end) >=
(select count(distinct supplier_answers.question_index)
from supplier_answers where campaign_id = 1)) t //<---- here you need a table name eg: t
where t.strong_answers >= (select count(distinct supplier_answers.question_index) from supplier_answers where campaign_id = 1)

MySQL - Rows to Columns and keeps NULL

We have the following table (TEST2) in the MySQL database (MySQL 5.6):
TEAM_ID,MEMBER_ID,TYPE,SCORE
1,2,A,150
1,3,B,200
1,1,B,50
1,1,A,100
1,2,B,NULL
We try to transform/pivot the above table based on the TYPE column:
If the TYPE column has value == A, move the value in the SCORE column into a new column called A_SCORE. If the value in the SCORE column is NULL, it should show NULL in the new A_SCORE column.
If the TYPE column has value == B, move the value in the SCORE column into a new column called B_SCORE. If the value in the SCORE column is NULL, it should show NULL in the new B_SCORE column.
The following table is the one we are looking for (the wanted table):
TEAM_ID,MEMBER_ID,A_SCORE,B_SCORE,A_SCORE_MINUS_B_SCORE
1,1,100,50,50
1,2,150,NULL,NULL
1,3,0,200,-200
We tried the following query
SELECT TEAM_ID,MEMBER_ID,A_SCORE,B_SCORE,SUM(A_SCORE-B_SCORE) AS ACTUAL_MINUS_B_SCORE FROM
(SELECT TEAM_ID,MEMBER_ID,
CASE
WHEN SCORE IS NULL
THEN NULL
ELSE SUM(if(TYPE = 'A', SCORE,0) )
END A_SCORE,
CASE
WHEN SCORE IS NULL
THEN NULL
ELSE SUM(if(TYPE = 'B', SCORE,0) )
END B_SCORE
FROM TEST2
GROUP BY TEAM_ID,MEMBER_ID,SCORE) AS A
GROUP BY TEAM_ID,MEMBER_ID,A_SCORE,B_SCORE);
It returns something we don’t want:
TEAM_ID,MEMBER_ID,A_SCORE,B_SCORE,A_SCORE_MINUS_B_SCORE
1,1,0,50,-50
1,1,100,0,100
1,2,0,0,0
1,2,150,0,150
1,3,0,200,-200
If we tried the following, it generates a table close to what we want, but it doesn’t return any NULL value.
SELECT TEAM_ID,MEMBER_ID,A_SCORE,B_SCORE,SUM(A_SCORE-B_SCORE) AS A_SCORE _MINUS_B_SCORE FROM
(SELECT TEAM_ID,MEMBER_ID,
SUM(if(TYPE = 'A', SCORE,0) ) AS A_SCORE,
SUM(if(TYPE = 'B', SCORE,0) )AS B_SCORE
FROM TEST2
GROUP BY TEAM_ID,MEMBER_ID) AS A
GROUP BY TEAM_ID,MEMBER_ID,A_SCORE,B_SCORE;
The result of the above query:
TEAM_ID,MEMBER_ID,A_SCORE,B_SCORE,A_SCORE_MINUS_B_SCORE
1,1,100,50,50
1,2,150,0,0
1,3,0,200,-200
Could any guru enlighten how to generate the wanted table in this case using MySQL? The SQL fiddle is here for your convenience.
http://sqlfiddle.com/#!9/cfe7a1/1
Thanks!
Try this;)
SELECT TEAM_ID, MEMBER_ID, A_SCORE, B_SCORE, A_SCORE - B_SCORE AS A_SCORE_MINUS_B_SCORE
FROM (
SELECT
TEAM_ID, MEMBER_ID,
CASE
WHEN A_SCORE IS NULL AND NOT EXISTS (
SELECT 1 FROM TEST2
WHERE TEAM_ID = T1.TEAM_ID
AND MEMBER_ID = T1.MEMBER_ID
AND TYPE = 'A'
) THEN 0 ELSE A_SCORE END AS A_SCORE,
CASE
WHEN B_SCORE IS NULL AND NOT EXISTS (
SELECT 1 FROM TEST2
WHERE TEAM_ID = T1.TEAM_ID
AND MEMBER_ID = T1.MEMBER_ID
AND TYPE = 'A'
) THEN 0 ELSE B_SCORE END AS B_SCORE
FROM (
SELECT
TEAM_ID, MEMBER_ID,
MAX(CASE WHEN TYPE = 'A' THEN SCORE END) AS A_SCORE,
MAX(CASE WHEN TYPE = 'B' THEN SCORE END) AS B_SCORE
FROM TEST2
GROUP BY TEAM_ID, MEMBER_ID
) T1
)T
SQLFiddle demo here
I don't quite understand the calculation criteria, but something like this should work...
SELECT team_id
, member_id
, COALESCE(MAX(CASE WHEN type = 'A' THEN score END),0) a_score
, COALESCE(MAX(CASE WHEN type = 'B' THEN score END),0) b_score
, COALESCE(MAX(CASE WHEN type = 'A' THEN score END),0)
- COALESCE(MAX(CASE WHEN type = 'B' THEN score END),0) diff
FROM test2
GROUP
BY team_id
, member_id;

mysql get difference of two sum on the same table

how can i get the result in just one query instead of this one:
SELECT SUM(`quantity`) as type0 FROM `fruits_delivery`
WHERE `fid`='1001' AND `type`=0;
result_1 = type0 ;
SELECT SUM(`quantity`) as type1 FROM `fruits_delivery`
WHERE `fid`='1001' AND `type`=1;
result_2 = type1 ;
final_result = result_1 - result_2;
You should use this
SELECT sum(IF(`type`=0, `quantity`, 0))-sum(IF(`type`=1, `quantity`, 0))
AS `final_result`
FROM `fruits_delivery`
WHERE `fid` = '1001'
sqlfiddle
Old Answer
SELECT T1.result - T2.result AS `final_result`
FROM (SELECT Sum(`quantity`) AS result,
`fid`
FROM `fruits_delivery`
WHERE `fid` = '1001'
AND `type` = 0
LIMIT 1) AS T1
JOIN (SELECT Sum(`quantity`) AS result,
`fid`
FROM `fruits_delivery`
WHERE `fid` = '1001'
AND `type` = 1
LIMIT 1) AS T2
ON ( T1.fid = T2.fid )
SQLFiddle
Alternatively, you can also do it using CASE
SELECT SUM(CASE WHEN type = 0 THEN quantity ELSE 0 END) -
SUM(CASE WHEN type = 1 THEN quantity ELSE 0 END)
AS final_result
FROM fruits_delivery
WHERE fid = '1001'
SQLFiddle Demo

MySQL order rank as a column

I have a MySQL query that selects data from multiple tables and then orders the results based on some arbitrary criteria as below:
SELECT [columns] FROM (
SELECT *, COUNT(*) as `matches`
FROM [table1]
JOIN [table2] USING (id)
JOIN [table3] USING (id)
WHERE [criteria]
GROUP BY `id`
ORDER BY `matches` DESC
) AS `grouped`
ORDER BY (
(CASE WHEN [1st rank criteria] THEN 3 ELSE 0 END) +
(CASE WHEN [2nd rank criteria] THEN 2 ELSE 0 END) +
(CASE WHEN [3rd tank criteria] THEN 1 ELSE 0 END)
) DESC
LIMIT 100
This works fine, but my question is: can I have the ranking score displayed as a column? I've looked at trying to use variables, but I'm quite new to SQL so all this is a bit beyond me.
Sorry if this is an obvious question, but many thanks in advance for your time and assistance.
Try this:
SELECT [columns],
(
(CASE WHEN [1st rank criteria] THEN 3 ELSE 0 END) +
(CASE WHEN [2nd rank criteria] THEN 2 ELSE 0 END) +
(CASE WHEN [3rd tank criteria] THEN 1 ELSE 0 END)
) AS MyRank
FROM (
SELECT *, COUNT(*) as `matches`
FROM [table1]
JOIN [table2] USING (id)
JOIN [table3] USING (id)
WHERE [criteria]
GROUP BY `id`
ORDER BY `matches` DESC
) AS `grouped`
ORDER BY MyRank DESC
LIMIT 100;
put it in the select
((CASE WHEN [1st rank criteria] THEN 3 ELSE 0 END) +
(CASE WHEN [2nd rank criteria] THEN 2 ELSE 0 END) +
(CASE WHEN [3rd tank criteria] THEN 1 ELSE 0 END)) as ranking