質問編集履歴

3 回答を受けコード修正した後の追加質問

agawa

agawa score 14

2019/04/12 13:08  投稿

SQLSERVER 複数行のデータをカンマ区切りで取得したい(GROUP_CONCAT同等の機能)
### 前提・実現したいこと
以下のようなテーブルがあり、出身と性別で集約してそこに含まれるデータ数(人数)を取得し、
さらに最終的に別処理で利用するため集約したデータのDataIdを取得したいです。
My SQLやORACLEではGROUP_CONCATで実現可能な機能ですがSQLSERVERのため使用できず詰まっています。
環境としてはVB.NETからSQL Serverに接続しています。
|DataId|出身|性別|氏名|
|:--|:--:|--:|
|001|東京|男|田中|
|002|東京|男|山本|
|003|東京|女|佐藤|
|004|大阪|男|鈴木|
|005|大阪|女|斉藤|
|006|大阪|女|前田|
|007|愛知|女|小西|
|008|愛知|女|佐々木|
欲しいのは以下の形です。
|出身|性別|人数|DataId|
|:--|:--:|--:|
|東京|男|2|001,002|
|東京|女|1|003|
|大阪|男|1|004|
|大阪|女|2|005,006|
|愛知|女|2|007,008|
過去ログを参照してコードを組みましたがうまくいきません。
コード自体に間違いがあれば教えていただきたいです。
また他の方法で実現可能であれば方法を教えていただけませんでしょうか。
よろしくお願いします。
### 発生している問題・エラーメッセージ
```
「データベースアクセス中に致命的なエラーが発生しました。
 キーワード'FROM'付近に不適切な構文があります。」
```
### 該当のソースコード
```SQLSERVER
SELECT
 tA.出身
,tA.性別
,COUNT(tA.氏名) AS 人数
,(SELECT tB.DataId + ","
  FROM テーブル1 AS tB
  WHERE tB.DataId = tA.DataId
  FOR XML PATH('')
  ) AS DataId
FROM テーブル1 AS tA
GROUP BY tA.出身,tA.性別
```
### 試したこと
過去ログや他サイトなど参照し以下でできそうだったので実装しましたが
上記のエラーで詰まってしまっています。
[過去ログ](https://teratail.com/questions/156977)
↓過去ログにあったリンク先
[参照サイト1](http://uyan39.hatenablog.com/entry/20120721/1342893081)
[参照サイト2](https://webbibouroku.com/Blog/Article/forxmlpath)
### 補足情報(FW/ツールのバージョンなど)
### 追加情報
hihijijiさんのアドバイスを受け、以下の通り修正したところエラー出ず動きました。
("," を ','に修正し、DataIdがint型なのでstr型にキャストしました。)
ただ、実行結果が想定と異なっている状態で、引き続き困っております。
ここにより詳細な情報を記載してく。」
現在の実行結果
|出身|性別|人数|DataId|
|:--|:--:|--:|
|東京|男|2|001,002,003,004,005,006,007,008|
|東京|女|1|001,002,003,004,005,006,007,008|
|大阪|男|1|001,002,003,004,005,006,007,008|
|大阪|女|2|001,002,003,004,005,006,007,008|
|愛知|女|2|001,002,003,004,005,006,007,008|
全てのDataIdを連結してしまっている状態です。
自分自身とテーブルでサブクエリを組んでるので当たり前の結果のような気もしていますが
どのようにすればほしい結果が得られるのか考えつかない状態です。
クエリの組み方や他の方法などあればアドバイスいただけませんでしょうか。
よろしくお願いします。
### 該当のソースコード(hihijijiさんのアドバイス後)
SELECT
tA.出身
,tA.性別
,COUNT(tA.氏名) AS 人数
,(SELECT STR(tB.DataId) + ','
FROM テーブル1 AS tB
WHERE tB.DataId = tA.DataId
FOR XML PATH('')
) AS DataId
FROM テーブル1 AS tA
GROUP BY tA.出身,tA.性別
  • SQL Server

    1334 questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

2 リンク先の内容を修正しました。

agawa

agawa score 14

2019/04/12 12:19  投稿

SQLSERVER 複数行のデータをカンマ区切りで取得したい(GROUP_CONCAT同等の機能)
### 前提・実現したいこと
以下のようなテーブルがあり、出身と性別で集約してそこに含まれるデータ数(人数)を取得し、
さらに最終的に別処理で利用するため集約したデータのDataIdを取得したいです。
My SQLやORACLEではGROUP_CONCATで実現可能な機能ですがSQLSERVERのため使用できず詰まっています。
環境としてはVB.NETからSQL Serverに接続しています。
|DataId|出身|性別|氏名|
|:--|:--:|--:|
|001|東京|男|田中|
|002|東京|男|山本|
|003|東京|女|佐藤|
|004|大阪|男|鈴木|
|005|大阪|女|斉藤|
|006|大阪|女|前田|
|007|愛知|女|小西|
|008|愛知|女|佐々木|
欲しいのは以下の形です。
|出身|性別|人数|DataId|
|:--|:--:|--:|
|東京|男|2|001,002|
|東京|女|1|003|
|大阪|男|1|004|
|大阪|女|2|005,006|
|愛知|女|2|007,008|
過去ログを参照してコードを組みましたがうまくいきません。
コード自体に間違いがあれば教えていただきたいです。
また他の方法で実現可能であれば方法を教えていただけませんでしょうか。
よろしくお願いします。
### 発生している問題・エラーメッセージ
```
「データベースアクセス中に致命的なエラーが発生しました。
 キーワード'FROM'付近に不適切な構文があります。」
```
### 該当のソースコード
```SQLSERVER
SELECT
 tA.出身
,tA.性別
,COUNT(tA.氏名) AS 人数
,(SELECT tB.DataId + ","
  FROM テーブル1 AS tB
  WHERE tB.DataId = tA.DataId
  FOR XML PATH('')
  ) AS DataId
FROM テーブル1 AS tA
GROUP BY tA.出身,tA.性別
```
### 試したこと
過去ログや他サイトなど参照し以下でできそうだったので実装しましたが
上記のエラーで詰まってしまっています。
↓過去ログ
[リンク内容](https://teratail.com/questions/156977)
[過去ログ](https://teratail.com/questions/156977)
↓過去ログにあったリンク先
[リンク内容](http://uyan39.hatenablog.com/entry/20120721/1342893081)
[リンク内容](https://webbibouroku.com/Blog/Article/forxmlpath)
[参照サイト1](http://uyan39.hatenablog.com/entry/20120721/1342893081)
[参照サイト2](https://webbibouroku.com/Blog/Article/forxmlpath)
### 補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してく。」
  • SQL Server

    1334 questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

1 ・URLをリンクに修正しました。・曖昧な表現があったので修正しました。

agawa

agawa score 14

2019/04/12 12:17  投稿

SQLSERVER 複数行のデータをカンマ区切りで取得したい(GROUP_CONCAT同等の機能)
### 前提・実現したいこと
以下のようなテーブルがあり、出身と性別で集約してそこに含まれるデータ数(人数)を取得し、
さらに最終的に別処理で利用するため集約したデータのDataIdを取得したいです。
My SQLやORACLEではGROUP_CONCATで実現可能な機能ですがSQLSERVERのため使用できず詰まっています。
環境としてはVB.NETからSQL Serverに接続しています。  
|DataId|出身|性別|氏名|
|:--|:--:|--:|
|001|東京|男|田中|
|002|東京|男|山本|
|003|東京|女|佐藤|
|004|大阪|男|鈴木|
|005|大阪|女|斉藤|
|006|大阪|女|前田|
|007|愛知|女|小西|
|008|愛知|女|佐々木|
欲しいのは以下の形です。
|出身|性別|人数|DataId|
|:--|:--:|--:|
|東京|男|2|001,002|
|東京|女|1|003|
|大阪|男|1|004|
|大阪|女|2|005,006|
|愛知|女|2|007,008|
コード自体に間違いがあれば教えていただきたいです。
また他の方法で実現可能であれば方法を教えていただけませんでしょうか。
よろしくお願いします。  
### 発生している問題・エラーメッセージ
```
「データベースアクセス中に致命的なエラーが発生しました。
 キーワード'FROM'付近に不適切な構文があります。」
```
### 該当のソースコード
```SQLSERVER
SELECT
 tA.出身
,tA.性別
,COUNT(tA.氏名) AS 人数
,(SELECT tB.DataId + ","
  FROM テーブル1 AS tB
  WHERE tB.DataId = tA.DataId
  FOR XML PATH('')
  ) AS DataId
FROM テーブル1 AS tA
GROUP BY tA.出身,tA.性別
```
### 試したこと
過去ログや他サイトなど参照し以下でできそうだったので実装しましたが
うまくいきませんでした。
http://uyan39.hatenablog.com/entry/20120721/1342893081
https://webbibouroku.com/Blog/Article/forxmlpath
上記のエラーで詰まってしまっています。
↓過去ログ
[リンク内容](https://teratail.com/questions/156977)
↓過去ログにあったリンク先
[リンク内容](http://uyan39.hatenablog.com/entry/20120721/1342893081)
[リンク内容](https://webbibouroku.com/Blog/Article/forxmlpath)
### 補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してく。」
  • SQL Server

    1334 questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る