Sybase SQLでGROUP BY句の値をFOR XML PATHで取得する
GROUP BY 句の値のリストを取得する方法
Sybase SQL で GROUP BY 句の値のリストを取得するには、いくつかの方法があります。 具体的な方法は、使用する Sybase バージョンと、取得したい値の種類によって異なります。
方法
サブクエリを使用する
Sybase 12 以前のバージョンでは、サブクエリを使用して GROUP BY 句の値のリストを取得できます。 以下の例では、products
テーブルから category
ごとの製品名のリストを取得しています。
SELECT category,
(SELECT name
FROM products
WHERE category = p.category) AS product_names
FROM products AS p
GROUP BY category;
FOR XML PATHを使用する
SELECT category,
(SELECT name
FROM products
WHERE category = p.category
FOR XML PATH('')) AS product_names
FROM products AS p
GROUP BY category;
STRING_AGG 関数を使用する
SELECT category,
STRING_AGG(name, ', ') AS product_names
FROM products
GROUP BY category;
補足
- 上記の例では、
products
テーブルを使用していますが、他のテーブルでも同様に処理できます。 - 取得したい値の種類に応じて、SELECT 句を変更する必要があります。
- GROUP BY 句で複数の列を指定している場合は、WHERE 句で条件を指定する必要があります。
SELECT category,
(SELECT name
FROM products
WHERE category = p.category) AS product_names
FROM products AS p
GROUP BY category;
FOR XML PATHを使用する
SELECT category,
(SELECT name
FROM products
WHERE category = p.category
FOR XML PATH('')) AS product_names
FROM products AS p
GROUP BY category;
STRING_AGG 関数を使用する
SELECT category,
STRING_AGG(name, ', ') AS product_names
FROM products
GROUP BY category;
GROUP BY 句で複数の列を指定すると、各列の組み合わせごとにグループ化されます。 以下の例では、products
テーブルから category
と color
ごとの製品名のリストを取得しています。
SELECT category,
color,
(SELECT name
FROM products
WHERE category = p.category
AND color = p.color) AS product_names
FROM products AS p
GROUP BY category,
color;
HAVING 句は、GROUP BY 句の結果に対して条件を指定するために使用できます。 以下の例では、products
テーブルから category
ごとの製品数の合計が10個以上のグループの製品名のリストを取得しています。
SELECT category,
(SELECT name
FROM products
WHERE category = p.category) AS product_names
FROM products AS p
GROUP BY category
HAVING COUNT(*) >= 10;
ユーザー定義関数を使用して、GROUP BY 句の値のリストを取得することもできます。 以下の例では、products
テーブルから category
ごとの製品名のリストをカンマ区切りで取得するユーザー定義関数 get_product_names
を使用しています。
CREATE FUNCTION get_product_names(@category VARCHAR(50))
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @product_names VARCHAR(MAX)
SELECT @product_names = STRING_AGG(name, ', ')
FROM products
WHERE category = @category
RETURN @product_names
END
GO
SELECT category,
get_product_names(category) AS product_names
FROM products
GROUP BY category;
sql group-by sybase