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

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

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

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

Q&A

解決済

3回答

8394閲覧

SQLで、重複行を一つにまとめて、カラムの値を加算したい。

gzt_n

総合スコア2

SQL

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

0グッド

0クリップ

投稿2020/07/27 07:10

SQL文を作成しているのですが、思い通りに抽出が行えていないので質問します。

実現したい条件は下記のとおりです。

以下のZZZテーブルでLine1とLine2が重複している行がある場合、Noが最も小さい1行のみを出力する。その際、QtyとTaxを、出力する1行に加算してまとめる。

イメージ説明

画像のテーブルの場合であれば、以下のような出力結果にしたいです。

イメージ説明

(ID0001と、ID0002はLine1とLine2の値が重複しているため、
ID0001のみを出力し、Qtyを10+11=21、Taxを100+110=210で出力。)

試したこと

どうにも書き方がよくわからず、インターネットで調べながら以下のようなコードを記入してみました。
集計が HAVING 句または選択リスト内のサブクエリにある場合、および集計する列が外部参照の場合にだけ、WHERE 句に集計を含めることができます。
というようなエラーが発生しました。

SELECT ID,Line1,Line2,Line3,Line4,Product,Q,Tax,Date,Bikou1,Bikou2
FROM ZZZ t2
WHERE NOT EXISTS ( SELECT t2.ID,t2.Line1,t2.Line2,t2.Line3,t2.Line4,t2.Product,SUM(t2.Qty),SUM(t2.Tax),t2.Date,t2.Bikou1,t2.Bikou2,SUM(t2.Price)
FROM ZZZ t1
WHERE t2.Line1 =t1.Line1 AND (t2.ID) > (t1.ID) AND t2.Line2 = t1.Line2 AND (t2.ID) > (t1.ID))

上記条件の解決をどうかよろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

SQLServer Express(2017)

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

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

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

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

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

hihijiji

2020/07/27 07:16

> Noが最も小さい1行 Noって何ですか?IDの間違い? 質問を加筆or訂正してください。
guest

回答3

0

Line1、Line2が重複してる場合に、Noが最も小さい1行のみの部分でNoというカラムがない話ですが、
想定結果行から最も小さいIDの一行と推測して回答します。
分析関数を使った手法です。
さすがにデータベースやテーブルを用意して動作確認はできてないのでご了承下さい。

SQL

1SELECT ID,Line1,Line2,Line3,Line4,Product,SUM_Qty,SUM_Tax,Date,Bikou1,Bikou2 2FROM ( 3 SELECT 4 t2.*, 5 MIN(t2.ID) OVER(PARTITION BY t2.Line1, t2.Line2) AS MIN_ID, 6 SUM(t2.Qty) OVER(PARTITION BY t2.Line1, t2.Line2) AS SUM_Qty, 7 SUM(t2.Tax) OVER(PARTITION BY t2.Line1, t2.Line2) AS SUM_Tax 8 FROM ZZZ t2 9) t1 10WHERE t1.MIN_ID = t1.ID

投稿2020/07/27 07:49

yureighost

総合スコア2183

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

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

0

ベストアンサー

エラー自体はGROUP BYの指定が無い項目を集計関数(SUM()など)と共に使用しているからです。

ですが、Existsの使用方法も誤っています。

SQL

1SELECT ID, t1.Line1, t1.Line2, Line3, Line4, Product 2 , t2.SUM_Qty as Qty, t2.SUM_Tax as Tax 3 , Date, Bikou1, Bikou2 4FROM ZZZ t1 inner join ( 5 select Line1, Line2, SUM(Qty) SUM_QTY, SUM(Tax) SUM_TAX 6 FROM ZZZ 7 group by Line1, Line2 8 ) t2 9 on t1.Line1=t2.Line1 and t1.Line2=t2.Line2 10WHERE NOT EXISTS ( 11 SELECT 1 FROM ZZZ WHERE Line1 =t1.Line1 AND Line2 = t1.Line2 AND ID < t1.ID 12 )

他の回答をみて追記(上記より高速だと思います)

SQL

1SELECT ID, t1.Line1, t1.Line2, Line3, Line4, Product 2 , t2.SUM_Qty as Qty, t2.SUM_Tax as Tax 3 , Date, Bikou1, Bikou2 4FROM ZZZ t1 inner join ( 5 select SUM(Qty) SUM_QTY, SUM(Tax) SUM_TAX, Min(ID) as Min_ID 6 FROM ZZZ 7 group by Line1, Line2 8 ) t2 9 on t1.ID=T2.Min_ID

投稿2020/07/27 07:41

編集2020/07/27 08:53
sazi

総合スコア25327

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

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

gzt_n

2020/07/27 08:36 編集

回答ありがとうございます。 こちら試してみたのですが、ID0001のみが出力されてしまいました ID0003と0004を出力するにはどのように行えばよろしいのでしょうか。
sazi

2020/07/27 08:51 編集

Line1やLine2のデータにNUllが含まれていますか? 後半部分はNullでも大丈夫なように修正しました。
guest

0

Line1,Line2を使ったgroup byして数値はsumを取ってください
Line3はどういうロジックで1行目が優先されているのか明示されていないので
わかりません

投稿2020/07/27 07:18

yambejp

総合スコア116732

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

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

yambejp

2020/07/27 07:24

文字列はmaxでもとっておけばいいですかねぇ・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問