プロが教えるわが家の防犯対策術!

SQLServer2008を使用しています。

下記のように一つの売上データが伝票番号をキーとして一つのテーブルに複数レコードに分けて登録されています。


伝票番号 分類 区分 データ
1       1   1   2500
1       2   1     0
1       3   1   A123
2       1   1   9800
2       2   2     0
2       3   1     0

分類が1だと売上金額、2だと区分が1なら現金、2ならカード支払いなどとフィールド内の値によって意味分けされています。

上記例ですと伝票番号1は顧客ID A123の客が現金で2500円、
伝票番号2は顧客ID 0(フリー客)客がカードで9800円支払ったデータということになります。

上記のようなデータ構造で現金の売上のみ、カード売上のみの集計などを行いたいのですが、
同一テーブル内の別レコードの値を条件に検索集計をSQL文だけで行うことは可能でしょうか?

可能でしたらどのようなSQLを使用すれば良いのか教えていただけると幸いです。
よろしくお願い致します。

A 回答 (4件)

No.3です。


すみません。
すでに nda23さんが同様の回答(1レコードにまとめるか別レコードに分けるかが違いますが)をされていましたね。

また、補足に
>データ項目は数値項目です。顧客コードも数値で入っています。
とあるのに、余計な変換も入れてしまいました・・・

ちゃんと読まずに申し訳ないです。
    • good
    • 0

売上金額レコードと支払方法レコードを自己結合すればいいのではないでしょうか。



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の環境が無いので動作確認はしていません。
    • good
    • 0
この回答へのお礼

yamada_g様

アドバイスありがとうございます。
教えていただいたSQLを参考に自己結合を理解したいと思います。

お礼日時:2011/11/01 16:30

データに数値と「A123」のような文字が入っているものがありますが、これはどのように考えればいいのでしょう。

データがVARCHARで複数レコードに別れていいなら
SELECT 分類, SUM(CAST(データ AS INT)) 集計金額
FROM 売上データ
WHERE 分類 IN ( '1', '2' )
GROUP BY 分類;

後、「顧客ID」と書かれていますが売上データにはそれに類するものが見当たらないのが気になります。
    • good
    • 0
この回答へのお礼

nora1962様
早々のアドバイスありがとうございます。

データ項目は数値項目です。顧客コードも数値で入っています。
紛らわしい書き方で申し訳ない。

>売上データにはそれに類するものが見当たらないのが気になります。
同じ伝票番号のレコード全部で一つの売上げデータになっています。
で分類の値によってデータフィールドの中身が売上金額や顧客コードに別れています。

お礼日時:2011/10/31 21:34

環境が無いので不明ですが、以下のような理論で


実行すればよいのでは?
(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を考える時は先ず理論を組み立てから実施しないと
何時までも使えるようになりませんよ。
    • good
    • 0
この回答へのお礼

nda23様
早々のご指導ありがとうございます。

教えていただいたSQLをまず理解してみます。

お礼日時:2011/10/31 15:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!