- ベストアンサー
同一テーブル内のデータを検索条件に使いたい-質問
- 同一テーブルのデータを条件にして集計するためのSQL文を教えてください。
- 伝票番号をキーとして複数のレコードが登録されたテーブルで、特定の条件で集計を行いたいです。
- 具体的には、分類が1のデータの売上金額を取得したいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
環境が無いので不明ですが、以下のような理論で 実行すればよいのでは? (1)売り上げだけのクエリを作る。 (2)支払い方法だけのクエリを作る。 (3)上記を結合して、支払い方法別の集計をとる。 SELECT MAX(A.ダミー) AS 架空, SUM(CASE B.区分 WHEN 1 THEN A.データ ELSE 0 END) AS 現金, SUM(CASE B.区分 WHEN 2 THEN A.データ ELSE 0 END) AS カード FROM (SELECT 1 AS ダミー,伝票番号,データ FROM テーブル WHERE 分類=1) AS A INNER JOIN (SELECT 伝票番号,区分 FROM テーブル WHERE 分類=2) AS B ON A.伝票番号=B.伝票番号 GROUP BY A.ダミー SQLを考える時は先ず理論を組み立てから実施しないと 何時までも使えるようになりませんよ。
その他の回答 (3)
- yamada_g
- ベストアンサー率68% (258/374)
No.3です。 すみません。 すでに nda23さんが同様の回答(1レコードにまとめるか別レコードに分けるかが違いますが)をされていましたね。 また、補足に >データ項目は数値項目です。顧客コードも数値で入っています。 とあるのに、余計な変換も入れてしまいました・・・ ちゃんと読まずに申し訳ないです。
- yamada_g
- ベストアンサー率68% (258/374)
売上金額レコードと支払方法レコードを自己結合すればいいのではないでしょうか。 select 支払方法, sum(金額) 合計金額 from ( select convert(int, amount.データ) 金額 ,case payment_method.区分 when 1 then '現金' when 2 then 'カード' else '不明' end as 支払方法 from t amount inner join t payment_method on amount.伝票番号 = payment_method.伝票番号 and payment_method.分類 = 2 where amount.分類 = 1) group by 支払方法; SQLServerの環境が無いので動作確認はしていません。
お礼
yamada_g様 アドバイスありがとうございます。 教えていただいたSQLを参考に自己結合を理解したいと思います。
- nora1962
- ベストアンサー率60% (431/717)
データに数値と「A123」のような文字が入っているものがありますが、これはどのように考えればいいのでしょう。データがVARCHARで複数レコードに別れていいなら SELECT 分類, SUM(CAST(データ AS INT)) 集計金額 FROM 売上データ WHERE 分類 IN ( '1', '2' ) GROUP BY 分類; 後、「顧客ID」と書かれていますが売上データにはそれに類するものが見当たらないのが気になります。
お礼
nora1962様 早々のアドバイスありがとうございます。 データ項目は数値項目です。顧客コードも数値で入っています。 紛らわしい書き方で申し訳ない。 >売上データにはそれに類するものが見当たらないのが気になります。 同じ伝票番号のレコード全部で一つの売上げデータになっています。 で分類の値によってデータフィールドの中身が売上金額や顧客コードに別れています。
お礼
nda23様 早々のご指導ありがとうございます。 教えていただいたSQLをまず理解してみます。