私はこのようなテーブルを持っています:
date day weather
2000-01-01 Monday Sunny
2000-01-02 Tuesday Rainy
。。。
次のような1つのクエリで、雨の月曜日と晴れの月曜日の数を取得したい
day rainy_d sunny_d
Monday 2 5
MysqlとPostgreSQLでそれを達成する方法は?
私はこのようなテーブルを持っています:
date day weather
2000-01-01 Monday Sunny
2000-01-02 Tuesday Rainy
。。。
次のような1つのクエリで、雨の月曜日と晴れの月曜日の数を取得したい
day rainy_d sunny_d
Monday 2 5
MysqlとPostgreSQLでそれを達成する方法は?
select `Day`,
SUM(case when weather = 'Sunny' THEN 1 ELSE 0 end) as Sunny_D,
SUM(case when weather = 'Rainy' THEN 1 ELSE 0 end) as Rainy_D
FROM YOURTABLENAME
Where day = 'Monday'
Group by `Day`
標準SQL、次の両方で機能します。
SELECT
day,
SUM(CASE WHEN weather = 'Rainy' THEN 1 ELSE 0 END) AS rainy_d,
SUM(CASE WHEN weather = 'Sunny' THEN 1 ELSE 0 END) AS sunny_d
FROM yourtable
GROUP BY day
より簡潔なバージョン-MySQLのみ:
SELECT
day,
SUM(weather = 'Rainy') AS rainy_d,
SUM(weather = 'Sunny') AS sunny_d
FROM yourtable
GROUP BY day
より簡潔なバージョン-PostgreSQLのみ:
SELECT
day,
SUM((weather = 'Rainy')::int) AS rainy_d,
SUM((weather = 'Sunny')::int) AS sunny_d
FROM yourtable
GROUP BY day
列day
はおそらく冗長です。置換せずに削除します。この列date
にはすべての情報が含まれています。次に、クエリは次のようになります。
PostgreSQLの場合:
SELECT to_char(date, 'Day') AS day
,COUNT(NULLIF(weather,'Sunny')) AS rainy_d
,COUNT(NULLIF(weather,'Rainy')) AS sunny_d
FROM tbl
GROUP BY 1;
MySQLの場合:
SELECT DAYNAME(date) AS day
... rest identical
このNULLIF()
構成は、列内の2つの異なる(null以外の)値に対して機能し、weather
標準のSQLです。その他の値については、@Markおよび@xQbertによって提供される代替を使用してください。