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

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

ただいまの
回答率

88.36%

mysqlにてグループ化し合計し、横持ちで取得したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,924

u-sukesan

score 109

例えば以下のテーブルから

ordercode(int) dat(date) cat(int) price(int) tantou(text)
240 2017-05-11 1 12000 鈴木
240 2017-05-11 1 3000 鈴木
240 2017-05-11 2 8000 鈴木
242 2017-05-11 1 12000 田中
242 2017-05-11 1 3000 田中
242 2017-05-11 1 2000 田中
242 2017-05-11 2 10000 田中
242 2017-05-11 2 8000 田中
243 2017-05-11 1 12000 伊藤
243 2017-05-11 2 8000 伊藤
243 2017-05-11 2 5000 伊藤
243 2017-05-11 2 2000 伊藤
243 2017-05-11 2 3000 鈴木
243 2017-05-11 3 5000 鈴木
243 2017-05-11 3 3000 鈴木
245 2017-05-11 1 12000 鈴木

「ordercode」「dat」「tanotu」でグループ化し
cat毎に合計し
横並びにしたい場合、どのようなsqlを書けばよろしいでしょうか?

ordercode dat tantou cat1 cat2 cat3
240 2017-05-11 鈴木 15000 8000 0
242 2017-05-11 田中 17000 18000 0
243 2017-05-11 伊藤 12000 15000 0
243 2017-05-11 鈴木 0 3000 8000
245 2017-05-11 鈴木 12000 0 0

追記:

上記から発展させたく追記します。

ordercode(int) dat(date) cat(int) price(int) tantou(text)
240 2017-05-11 1 12000 鈴木
240 2017-05-11 1 3000 鈴木
240 2017-05-11 2 8000 鈴木
240 2017-05-11 3 4000 鈴木
242 2017-05-11 1 12000 田中
242 2017-05-11 1 3000 田中
242 2017-05-11 1 2000 田中
242 2017-05-11 3 2000 田中
242 2017-05-11 2 10000 田中
242 2017-05-11 2 8000 田中
243 2017-05-11 1 12000 伊藤
243 2017-05-11 2 8000 伊藤
243 2017-05-11 2 5000 伊藤
243 2017-05-11 2 2000 伊藤
243 2017-05-11 1 13000 鈴木
243 2017-05-11 2 3000 鈴木
243 2017-05-11 3 5000 鈴木
243 2017-05-11 3 3000 鈴木
245 2017-05-11 1 12000 鈴木
245 2017-05-11 3 1000 鈴木

下記のようにしたい。

条件は
cat3>0である場合
cat2>0であればcat2-cat3を返す
cat2<cat3の場合はcat2を0とし
cat1をcat1-(cat3-cat2)とする

ordercode dat tantou cat1 cat2 cat3
240 2017-05-11 鈴木 15000 4000 4000
242 2017-05-11 田中 17000 16000 2000
243 2017-05-11 伊藤 12000 15000 0
243 2017-05-11 鈴木 8000 0 8000
245 2017-05-11 鈴木 11000 0 1000
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

こうしてください

  • 元データ
create table tbl(ordercode int,dat date,cat int,price int,tantou varchar(20));
insert into tbl values
(240,'2017-05-11',1,12000,'鈴木'),
(240,'2017-05-11',1,3000,'鈴木'),
(240,'2017-05-11',2,8000,'鈴木'),
(242,'2017-05-11',1,12000,'田中'),
(242,'2017-05-11',1,3000,'田中'),
(242,'2017-05-11',1,2000,'田中'),
(242,'2017-05-11',2,10000,'田中'),
(242,'2017-05-11',2,8000,'田中'),
(243,'2017-05-11',1,12000,'伊藤'),
(243,'2017-05-11',2,8000,'伊藤'),
(243,'2017-05-11',2,5000,'伊藤'),
(243,'2017-05-11',2,2000,'伊藤'),
(243,'2017-05-11',2,3000,'鈴木'),
(243,'2017-05-11',3,5000,'鈴木'),
(243,'2017-05-11',3,3000,'鈴木'),
(245,'2017-05-11',1,12000,'鈴木');
  • 集計
select ordercode,dat,tantou
,sum(price*(cat=1)) as cat1
,sum(price*(cat=2)) as cat2
,sum(price*(cat=3)) as cat3
from tbl
group by ordercode,dat,tantou

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/22 17:47

    ちなみにtantouのように日本語入力されるようなブレがでそうなものは
    userid的なもので正規化したほうがSQL的な処理になります

    キャンセル

  • 2017/05/22 22:12

    yambejp様

    ありがとうございます。
    希望の結果を得ることができました。

    ここから少し発展させたいのですが
    追記しました



    ご指摘通りtantouは質問をわかりやすくするために日本語にしてあります。
    こちらでは数値を入れてありますので大丈夫です^^

    キャンセル

  • 2017/05/22 22:23 編集

    なんとなくわかりました

    select ordercode,dat,tantou
    ,cat1-(case when cat2<=cat3 then cat3-cat2 else 0 end) as cat1
    ,case when cat2>cat3 then cat2-cat3 else 0 end as cat2
    ,cat3
    from (
    select ordercode,dat,tantou
    ,sum(price*(cat=1)) as cat1
    ,sum(price*(cat=2)) as cat2
    ,sum(price*(cat=3)) as cat3
    from tbl
    group by ordercode,dat,tantou
    ) as sub;

    キャンセル

  • 2017/05/25 13:46

    いただきました内容をヒントに解決できました!

    重ね重ねありがとうございました。
    また機会がありましたらよろしくお願いいたします

    キャンセル

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

  • ただいまの回答率 88.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る