2017-10-08 8 views
0

によって、私はテーブルを次ていますSQLクエリ - オーダーイエスとノー四半期

id|overtime| date 
--+--------+----------- 
1 | yes | 2017-03-10 
2 | no  | 2017-07-16 
3 | yes | 2017-01-22 
4 | no  | 2017-07-14 

は、今私は(Q1Q2Q3Q4yes sおよびno秒を合計し、四半期でそれらを注文したいです:

yes| no| quarter 
---+---+--------------- 
13 | 4| Q1 
2 | 5| Q2 
8 | 14| Q3 
12 | 12| Q4 

私のソリューション:

SELECT 
    (select count(*) As sum_yes from dashboard where overtime = 'Yes') as yes, 
    (select count(*) As sum_no from dashboard where overtime = 'No') as no, 
    (SELECT quarter(date) as quarter from dashboard) 
group by quarter 

私はそれが動作しないことを知っています。助けを借りて非常に満足しています。

答えて

1

使用条件の集約:

select year(date) as yyyy, quarter(date) as q, 
     sum(overtime = 'Yes') as yes, 
     sum(overtime = 'No') as no 
from dashboard 
group by yyyy, q; 

注これは今年含まれていること。私は「四半期」を1年ごとに区別して解釈します。複数年のデータを結合する場合は、そのコンポーネントを削除します。

MySQLはブール値を数値コンテキスト内の整数として扱います。真であれば "1"、偽であれば "0"を返します。

1

ですから、四半期ごとに1つの行をしたい...

... 
FROM dashboard 
GROUP BY quarter(date); 

次にあなたがovertime = 'Yes'それらの行の数と1列を取得したいのですが:

SELECT 
    COUNT(CASE WHEN overtime = 'Yes' THEN 1 END) as yes, 
    ... 

そしてのためのより多くの1いいえ

... 
    COUNT(CASE WHEN overtime = 'No' THEN 1 END) as yes, 
    ... 

これだけです。 case式は一致する行を1にマップし、非マッピング行はnull(暗黙のelse null句のため)にマップします。

四分円を追加するだけで完了です。

この手法についての詳細: http://modern-sql.com/use-case/pivot

+0

はあなたにマルクスをありがとう!それはうまく動作します! ここに私の質問があります: Ja、 としてCOUNT(残業時間= 'はい'、それから1時間) Quartalによるグループ – Ck2513

関連する問題