質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SQL Server

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

1811閲覧

SQLを使い、特定の条件に合致するレコードのみのidを列挙したい

mkk

総合スコア378

SQL Server

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/06/22 07:02

編集2020/06/22 07:32

前提・実現したいこと

javascript上でalasqlを使い、特定の条件に合致するレコードのみのidを列挙したいです。

データベースをそのまま載せられないので例で挙げますが、このようなデータベースがあります。

idnamecheckmoney
1AさんOK2000
2BさんOK500
3CさんNG1000
4AさんOK1400
5AさんNG600

これをnameでグループ化して、人ごとにOKとNGの合計金額を出し、OKになっているレコードのidを列挙したいです。


【求める結果】

nameOKNGids
Aさん34006001,4
Bさん50002
Cさん01000

該当のソースコード

alasql

1alasql( "SELECT cust.name, SUM(CASE WHEN cust.check = ? THEN cust.money ELSE 0 END) as [OK], \ 2 SUM(CASE WHEN cust.check = ? THEN cust.money ELSE 0 END) as [NG], \ 3 SUM(CASE WHEN cust.check = ? or cust.check = ? THEN cust.money ELSE 0 END) as [合計], \ 4 GROUP_CONCAT(cust.id) as [ids] \ 5 FROM ? AS cust \ 6 GROUP BY cust.name ORDER BY cust.name", ["OK", "NG", "OK", "NG", database] 7);

 
【このソースコードでの結果】

nameOKNGids
Aさん34006001,4,5
Bさん50002
Cさん010003

 
GROUP_CONCATを使って人ごとのidを列挙することができましたが、OKのレコードのみの条件を付けられません。
やり方や参考になるサイト等を教えて頂けないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

投稿2020/06/22 08:03

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mkk

2020/06/22 08:30

ご回答ありがとうございます。 教えていただいたサイトで調べてみたいと思います。
guest

0

ベストアンサー

GROUP_CONCATは非ヌル値のみを対象にします。
ですので条件に合致した時のみ値を有効にするようにすれば、良いかと思います。

alasql

1alasql( "SELECT cust.name, SUM(CASE WHEN cust.check = ? THEN cust.money ELSE 0 END) as [OK], \ 2 SUM(CASE WHEN cust.check = ? THEN cust.money ELSE 0 END) as [NG], \ 3 SUM(CASE WHEN cust.check = ? or cust.check = ? THEN cust.money ELSE 0 END) as [合計], \ 4 GROUP_CONCAT(CASE WHEN cust.check = ? then cust.id end) as [ids] \ 5 FROM ? AS cust \ 6 GROUP BY cust.name ORDER BY cust.name", ["OK", "NG", "OK", "NG", "OK", database] 7);

投稿2020/06/22 07:27

編集2020/06/22 07:43
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mkk

2020/06/22 07:45

ご回答ありがとうございます。 toyotaku様の方にもほぼ同様の件を記載致しましたが、今度はelseを使わずにSQLを書いても idsの中身が ["6", "5", "undefined", "1"] のようになってしまいます。 "undefined" の部分がNGのレコードのidがあったところです。 javascript上でalasqlを使ってGROUP_CONCATを使っている関係で MySqlのGROUP_CONCATと仕様が違っているなどがあるのでしょうか。
sazi

2020/06/22 08:00

どうなんでしょう? 素のSQLで確認されてみましたか?
sazi

2020/06/22 08:08

ありゃ?GROUP_CONCATとなっていたので、MySQLかと思ってましたが、SQLServerですか。 sqlserverなら該当するのは、string_agg()なので、alasqlが変換してるのかな?
mkk

2020/06/22 08:29

テストサイトで試してみましたが、MySQLでは、sazi様の仰る通りNULLが除外されて結果が表示されました。 string_agg() も初めて聞いたので調べてみます。
sazi

2020/06/22 08:37 編集

string_agg()はSQLserverです。(タグがSQLServerになっているので) MySQLとSQLServerのどっちなんでしょう?
sazi

2020/06/22 08:46 編集

Alasqlってライブラリーとかではなく、javaScriptデータベースですね。 だとすると、独自のリファレンスがあるはずなので確認して下さい。(見つけきれなかった)
sazi

2020/06/22 08:47

結果だけ見ると、AlasqlのGROUP_CONCAT()はNull除外しないみたいなので、サブクエリーが使えるなら、それで対応するという感じですかね。
mkk

2020/06/22 08:48

正直なところ、alasqlの全容がまだ見えておらずどちらとも言いがたいところです。 恐らくはalasqlという独自のものかと思いますが、ベースはSQLserverやMySQLから考えてありそうです。 下記サイトにSQL Serverと書いてあったのでタグに追加をしておりました。 https://qiita.com/rex0220/items/d1030b293c1021d28750 ただ、string_aggを使おうとしたところ関数が見つからずエラーとなってしまいました。
mkk

2020/06/22 08:49

ありがとうございます。 リファレンスを探してみます。
sazi

2020/06/22 08:52

> alasqlの全容がまだ見えておらずどちらとも言いがたいところです。 いえ、別物です。 > 下記サイトにSQL Serverと書いてあったのでタグに追加をしておりました。 それは、SQLを受け付けるSERVERという意味で、製品であるSQLServerとは違います。
mkk

2020/06/22 09:21

なるほど、勉強になりました。 ありがとうございました。
guest

0

GROUP_CONCAT(cust.id) のcust.idを
他の項目と同じようにcase文でOKの時だけidを返せばうまくいきそうに見えます。
else はnullすればよいでしょう。
【このソースコードでの結果】は、cさんはidsが3になっているのでは?

投稿2020/06/22 07:20

toyotaku

総合スコア103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mkk

2020/06/22 07:44

ご回答ありがとうございます。 【このソースコードでの結果】は修正させていただきました。 教えていただいた通りelseでNULLを指定してやってみたのですが、idsの中身が ["6", "5", "undefined", "1"] のようになってしまいます。 "undefined" の部分がNGのレコードのidがあったところです。 javascript上でalasqlを使ってGROUP_CONCATを使っている関係で MySqlのGROUP_CONCATと仕様が違っているなどがあるのでしょうか。
toyotaku

2020/06/22 08:08

あら、すみません。 arasqlについては知見がありません。お力になれず申し訳ないです。
mkk

2020/06/22 08:51

こちらこそ申し訳ないです。 他のSQLと同じ動きをすると思って通常のSQLのようにお伺いしてしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問