次のようなSQLがあります。


SELECT 商品区分, SUM(数量)
FROM 在庫テーブル
GROUP BY 商品区分

これを元に

・グループA:商品区分が12,23,34
・グループB:商品区分が11,22,33
・グループC:商品区分が上記以外

でグループ化するSQLを書いてみました。

SELECT "グループA", SUM(数量)
FROM 在庫テーブル
WHERE 商品区分 IN ('12', '23', '34')

UNION

SELECT "グループB", SUM(数量)
FROM 在庫テーブル
WHERE 商品区分 IN ('11', '22', '33')

UNION

SELECT "グループC", SUM(数量)
FROM 在庫テーブル
WHERE ( 商品区分 <> '12'
AND 商品区分 <> '23'
AND 商品区分 <> '34'
AND 商品区分 <> '11'
AND 商品区分 <> '22'
AND 商品区分 <> '33'
)

もっとシンプルな書き方があれば教えてください。

回答の条件
  • 1人2回まで
  • 登録:2007/09/29 15:00:58
  • 終了:2007/10/06 15:10:04

回答(4件)

id:KUROX No.1

KUROX回答回数3542ベストアンサー獲得回数1402007/09/29 15:20:08

ポイント35pt

各SELECT文の後ろにGROUP BY 商品区分が必要な気がします。

で、このSQLで実用レベルでシンプルだと私は思います。

----------------------------------------------

DBがORACLEなら

DECODE関数となにかを組み合わせれば別のSQLを書けるかも

しれませんが・・・。

http://www.mars.dti.ne.jp/~o-shin/new/kowaza/body530.html

http://oraclesqlpuzzle.hp.infoseek.co.jp/7-53.html

ORACLEのテクニックはこちらを

http://oraclesqlpuzzle.hp.infoseek.co.jp/

id:taknt No.2

きゃづみぃ回答回数13539ベストアンサー獲得回数11982007/09/29 15:55:41

ポイント35pt

DECODEを使うのは いかがでしょうか?

SELECT

gp,SUM(数量)

FROM

(SELECT

DECODE(商品区分,

'12', "グループA",

'23', "グループA",

'34', "グループA",

'11', "グループB",

'22', "グループB",

'33', "グループB", "グループC") gp,

数量

FROM 在庫テーブル)

GROUP BY gp

id:chuken_kenkou No.3

chuken_kenkou回答回数722ベストアンサー獲得回数542007/09/29 18:16:02

ポイント10pt

RDBMS名とバージョンが分からないと、具体的なSQLを提示しても、質問者さんの環境では実行できないかも知れません。

select g,sum(数量)
 from
  (select
     case when 商品区分 in('12','23','34') then 'グループA'
          when 商品区分 in('11','22','33') then 'グループB'
          else 'グループC'
     end as g,
     数量
    from 在庫テーブル) as x
 group by g
id:tail_furry No.4

敷守ほむら回答回数74ベストアンサー獲得回数72007/09/30 03:30:46

ポイント10pt

質問文を読みましたが、次のように出したいんでしょうか。

次のように出すのであれば、SELECTの部分に商品区分を追加した上に、GROUP BY 商品区分をつける必要がありますが…。

商品区分 グループ名 sum(数量)
12 グループA 8
23 グループA 12

ついでに、グループCを少しシンプルにして、別名を使って、

SELECT 商品区分, "グループA" as グループ名, SUM(数量) as 合計

FROM 在庫テーブル

WHERE 商品区分 IN ('12', '23', '34')

UNION

SELECT 商品区分, "グループB" as グループ名, SUM(数量) as 合計

FROM 在庫テーブル

WHERE 商品区分 IN ('11', '22', '33')

UNION

SELECT 商品区分, "グループC" as グループ名, SUM(数量) as 合計

FROM 在庫テーブル

WHERE 商品区分 NOT IN ('12', '23', '34', '11', '22', '33')

どうでしょう?


そういえば、使用しているデータベース管理ソフトは何でしょうか?ソフトによってSQL文の書き方が違うので、もし教えていただけたらもっと簡単な書き方ができるかもしれません。

  • id:b-wind
    DB が指定されていないので、どの構文が使えるかが特定できないのですが
    一般的には CASE 句と GROUP BY でできそうですね。
    http://www.drk7.jp/MT/archives/000787.html
  • id:KUROX
    CASE 句,
    ORACLEでも使えるんですね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません