GROUP_CONCAT、サブクエリーを利用してデータの抽出を行い
CONCATを用いて文字列を連結する。

CONCAT(str1,str2,…)

引数を連結した結果であるストリングを戻します。ひとつ以上の引数を持つ場合があります。
すべての引数が非バイナリ ストリングである場合、結果は非バイナリ ストリングになります。
引数がひとつでもバイナリ ストリングを含む場合は、結果はバイナリ ストリングになります。
数値の引数はそれに等しいバイナリ ストリング形態に変換されます。それを避けたい場合は、
次の例のように、明示的なタイプ キャストを使用することができます :

SELECT CONCAT(CAST(int_col AS CHAR), char_col);

サンプルテーブル
sample

サンプルデータ
sample_data

上記のテーブルからオフィシャル言語が多い国を抽出してみる。


select B.NAME,Count(*) SUM from
CountryLanguage A,Country B
where A.CountryCode = B.Code
AND A.ISOfficial = 'T'
GROUP BY B.Name
Order by SUM desc
limit 1;

select_official

select B.NAME,Count(*) SUM,
GROUP_CONCAT(Language) LANG
from CountryLanguage A,Country B
where A.CountryCode = B.Code
AND A.ISOfficial = 'T'
GROUP BY B.Name
ORDER BY SUM DESC
limit 1;

gc1


SELECT TMP.NAME,TMP.SUM,TMP.LANG FROM
(
select B.NAME,Count(*) SUM,
GROUP_CONCAT(Language) LANG
from CountryLanguage A,Country B
where A.CountryCode = B.Code
AND A.ISOfficial = 'T'
GROUP BY B.Name
ORDER BY SUM DESC
limit 1
) AS TMP;

gc2

上記結果をCONCATで結合して文言にする。

SELECT
CONCAT(
'The country ',
(SELECT Name FROM (
SELECT Name, COUNT(*) AS nlanguages,
GROUP_CONCAT(Language) as languages
FROM Country c, CountryLanguage cl
WHERE c.Code = cl.CountryCode
AND cl.IsOfficial = 'T'
GROUP BY Name
ORDER BY nlanguages DESC, Name
LIMIT 1
) AS tmp
),
' has ',
(SELECT nlanguages FROM (
SELECT Name, COUNT(*) AS nlanguages,
GROUP_CONCAT(Language) as languages
FROM Country c, CountryLanguage cl
WHERE c.Code = cl.CountryCode
AND cl.IsOfficial = 'T'
GROUP BY Name
ORDER BY nlanguages DESC, Name
LIMIT 1
) AS tmp1
),
' official languages: ',
(SELECT languages FROM (
SELECT Name, COUNT(*) AS nlanguages,
GROUP_CONCAT(Language) as languages
FROM Country c, CountryLanguage cl
WHERE c.Code = cl.CountryCode
AND cl.IsOfficial = 'T'
GROUP BY Name
ORDER BY nlanguages DESC, Name
LIMIT 1
) AS tmp2
)
) AS '文字の結合';

concat_sentenct

参考サイト
11.11.1. GROUP BY (Aggregate) Functions


11.3. 文字列関数

Comments are closed.

Post Navigation