C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

SQLについて

[トピック内 17 記事 (1 - 17 表示)]  << 0 >>

■92549 / inTopicNo.1)  SQLについて
  
□投稿者/ 初心者 (14回)-(2019/10/04(Fri) 14:29:45)

分類:[(わからない)] 


mysql使用


お世話になっております。
分類が分からないため、「(分からないにしています)」

1つのテーブルデータから詳細・小計・総計を表示したいと考えております。
ネットで調べたところROOLUPが有効と記述がされていたため、試しに入れてみることにしました。

実際のSQL文
-------------------------------
SELECT * FROM(
SELECT
ID1
, ID2
  , apple_name
, SUM(money) AS total
FROM
tbl_name
GROUP BY
ID1
, ID2 WITH ROLLUP) AS sq
--------------------------------

実行結果小計と総計は取得できているのですが、小計と総計の場合はapple_nameを取得しない(null)
としたいのですがどうしたら良いでしょうか?

例えばこんな感じ
ID1 ID2 total apple_name
----------------------------------
1 1 1 a1
1 2 1 a1
1 3 1 a1
-----------------------------------
1 null 3 null →小計
-----------------------------------
2 4 4 a2
2 5 4 a2
-----------------------------------
2 null 8 null →小計
-----------------------------------
null null 11 null →総計
-----------------------------------

何卒、宜しくお願い致します。


引用返信 編集キー/
■92550 / inTopicNo.2)  Re[1]: SQLについて
□投稿者/ 魔界の仮面弁士 (2411回)-(2019/10/04(Fri) 14:46:32)
2019/10/04(Fri) 14:47:01 編集(投稿者)

No92549 (初心者 さん) に返信
> mysql使用

MySQL は使ったことが無いですが、一番外側の SELECT を『SELECT * FROM(』を
こんな感じにしてみたらどうでしょう。

SELECT ID1, ID2, total, (CASE
WHEN ID1 IS NULL AND ID2 IS NULL THEN '総計'
WHEN ID1 IS NULL OR ID2 IS NULL THEN '小計'
ELSE apple_name END) AS apple_name FROM (
引用返信 編集キー/
■92551 / inTopicNo.3)  Re[2]: SQLについて
□投稿者/ 初心者 (15回)-(2019/10/04(Fri) 15:15:22)
No92550 (魔界の仮面弁士 さん) に返信

> MySQL は使ったことが無いですが、一番外側の SELECT を『SELECT * FROM(』を
> こんな感じにしてみたらどうでしょう。
>
> SELECT ID1, ID2, total, (CASE
> WHEN ID1 IS NULL AND ID2 IS NULL THEN '総計'
> WHEN ID1 IS NULL OR ID2 IS NULL THEN '小計'
> ELSE apple_name END) AS apple_name FROM (

ご回答ありがとうございます。実装したいことができました。

修正したSQL
-------------------------------------------------
SELECT ID1, ID2, total, (CASE
WHEN ID1 IS NULL AND ID2 IS NULL THEN '総計'→NULL
WHEN ID1 IS NULL OR ID2 IS NULL THEN '小計'→NULL
ELSE apple_name END) AS apple_name FROM (
SELECT
ID1
, ID2
  , apple_name
, SUM(money) AS total
FROM
tbl_name
GROUP BY
ID1
, ID2 WITH ROLLUP) AS sq
-------------------------------------------------

ありがとうございました。
追記で申し訳ございませんが、ELSEの後に名前を追加したくカンマ区切りで
追記したのですがエラーになってしまいました。
ELSEの後に名前を追加したいときはどうしたらいいでしょうか?


引用返信 編集キー/
■92552 / inTopicNo.4)  Re[3]: SQLについて
□投稿者/ 魔界の仮面弁士 (2412回)-(2019/10/04(Fri) 15:37:01)
No92551 (初心者 さん) に返信
> ELSEの後に名前を追加したくカンマ区切りで
> 追記したのですがエラーになってしまいました。

どのような結果になることを期待して、具体的にどういう SQL を
記述したのかが分からないと、間違っている箇所を指摘できません。(^^;
引用返信 編集キー/
■92553 / inTopicNo.5)  Re[4]: SQLについて
□投稿者/ 初心者 (16回)-(2019/10/04(Fri) 15:48:10)
2019/10/04(Fri) 15:50:03 編集(投稿者)

No92552 (魔界の仮面弁士 さん) に返信

> どのような結果になることを期待して、具体的にどういう SQL を
> 記述したのかが分からないと、間違っている箇所を指摘できません。(^^;

すみません、言葉足らずでした。

例えばこんな感じです。(実装したいこと)
ID1  ID2   total apple_name banana_name
---------------------------------------------------
1     1    1     a1 b1
1    2    1    a1 b1
1    3    1     a1 b1
----------------------------------------------------
1    null   3    null null →小計
---------------------------------------------------
2  4 4 a2 b2
2  5 4 a2 b2
---------------------------------------------------
2  null 8 null null →小計
---------------------------------------------------
null  null 11 null null →総計
---------------------------------------------------

実際に追加してみたSQL文はこうです。
-------------------------------------------------
SELECT ID1, ID2, total, (CASE
WHEN ID1 IS NULL AND ID2 IS NULL THEN '総計'→NULL
WHEN ID1 IS NULL OR ID2 IS NULL THEN '小計'→NULL
ELSE apple_name , banana_name END) AS apple_name FROM (

          追加した部分

このようにELSEの後に追加した結果エラーがでました。
増やすことはできないのでしょうか?


引用返信 編集キー/
■92554 / inTopicNo.6)  Re[4]: SQLについて
□投稿者/ のものも (1回)-(2019/10/04(Fri) 15:49:35)
もしかして、CASE文でELSEの場合は2項目分を出力したい、ということでしょうか?
CASE文を使う場合、対象となる項目は1つだけです。
ELSEの場合だけ複数個の項目を出力できてしまうと、
WHENの時とELSEの時でデータの整合性が取れなくなるじゃないですか。
ELSEの場合に複数項目が必要なら、その分CASE文を書く必要があります。

引用返信 編集キー/
■92555 / inTopicNo.7)  Re[5]: SQLについて
□投稿者/ 初心者 (17回)-(2019/10/04(Fri) 15:51:03)
No92553 (初心者 さん) に返信
> 2019/10/04(Fri) 15:50:03 編集(投稿者)
>
> ■No92552 (魔界の仮面弁士 さん) に返信
>
>>どのような結果になることを期待して、具体的にどういう SQL を
>>記述したのかが分からないと、間違っている箇所を指摘できません。(^^;
>
> すみません、言葉足らずでした。
>
> 例えばこんな感じです。(実装したいこと)
> ID1  ID2   total apple_name banana_name
> ---------------------------------------------------
> 1     1    1     a1 b1
> 1    2    1    a1 b1
> 1    3    1     a1 b1
> ----------------------------------------------------
> 1    null   3    null null →小計
> ---------------------------------------------------
> 2  4 4 a2 b2
> 2  5 4 a2 b2
> ---------------------------------------------------
> 2  null 8 null null →小計
> ---------------------------------------------------
> null  null 11 null null →総計
> ---------------------------------------------------
>
> 実際に追加してみたSQL文はこうです。
> -------------------------------------------------
> SELECT ID1, ID2, total, (CASE
> WHEN ID1 IS NULL AND ID2 IS NULL THEN '総計'→NULL
> WHEN ID1 IS NULL OR ID2 IS NULL THEN '小計'→NULL
> ELSE apple_name , banana_name END) AS apple_name FROM (
> ↑
>           追加した部分
>
> このようにELSEの後に追加した結果エラーがでました。
> 増やすことはできないのでしょうか?
>
>
引用返信 編集キー/
■92556 / inTopicNo.8)  Re[3]: SQLについて
□投稿者/ 大谷刑部 (33回)-(2019/10/04(Fri) 15:54:54)
No92551 (初心者 さん) に返信
> ■No92550 (魔界の仮面弁士 さん) に返信
> 追記で申し訳ございませんが、ELSEの後に名前を追加したくカンマ区切りで
> 追記したのですがエラーになってしまいました。
> ELSEの後に名前を追加したいときはどうしたらいいでしょうか?
>
何をしたいのかがよくわかりませんが、ELSEは「その他」の意味なので、
「カンマ区切りで複数の名前を追加したい」とかだったらそもそもそんなことできるわけありません。当然構文エラーでしょう。
ID1、ID2の組み合わせ条件ではELSEに該当するが、別の項目の条件で場合分けして複数の名前を表示したいのだとすると、
ELSEの中にもう一個CASE句がくるイメージになるかと思います。
引用返信 編集キー/
■92557 / inTopicNo.9)  Re[5]: SQLについて
□投稿者/ 魔界の仮面弁士 (2413回)-(2019/10/04(Fri) 15:55:03)
No92553 (初心者 さん) に返信
> このようにELSEの後に追加した結果エラーがでました。

その出力結果なら、こうなのでは?

SELECT
  ID1,
  ID2,
  total,
  apple_name,
  (CASE
    WHEN ID1 IS NULL AND ID2 IS NULL THEN '総計'
    WHEN ID1 IS NULL OR ID2 IS NULL THEN '小計'
    ELSE banana_name 
   END) AS banana_name
FROM (
 以下略

引用返信 編集キー/
■92558 / inTopicNo.10)  Re[5]: SQLについて
□投稿者/ 初心者 (18回)-(2019/10/04(Fri) 15:55:25)
No92554 (のものも さん) に返信
> もしかして、CASE文でELSEの場合は2項目分を出力したい、ということでしょうか?
> CASE文を使う場合、対象となる項目は1つだけです。
> ELSEの場合だけ複数個の項目を出力できてしまうと、
> WHENの時とELSEの時でデータの整合性が取れなくなるじゃないですか。
> ELSEの場合に複数項目が必要なら、その分CASE文を書く必要があります。

ご回答ありがとうございます。

のものもさんのおっしゃる通りです。
2項目分を出力したいということです。すみません、ありがとうございます。
同じ処理でも項目を増やしたいなら、同じのを書いて項目を変えるしかないということであっていますか?
引用返信 編集キー/
■92559 / inTopicNo.11)  Re[5]: SQLについて
□投稿者/ 大谷刑部 (34回)-(2019/10/04(Fri) 16:06:55)
No92553 (初心者 さん) に返信
> 2019/10/04(Fri) 15:50:03 編集(投稿者)
>
> ■No92552 (魔界の仮面弁士 さん) に返信
>
>>どのような結果になることを期待して、具体的にどういう SQL を
>>記述したのかが分からないと、間違っている箇所を指摘できません。(^^;
>
> すみません、言葉足らずでした。
>
> 例えばこんな感じです。(実装したいこと)
> ID1  ID2   total apple_name banana_name
> ---------------------------------------------------
> 1     1    1     a1 b1
> 1    2    1    a1 b1
> 1    3    1     a1 b1
> ----------------------------------------------------
> 1    null   3    null null →小計
> ---------------------------------------------------
> 2  4 4 a2 b2
> 2  5 4 a2 b2
> ---------------------------------------------------
> 2  null 8 null null →小計
> ---------------------------------------------------
> null  null 11 null null →総計
> ---------------------------------------------------
>
> 実際に追加してみたSQL文はこうです。
> -------------------------------------------------
> SELECT ID1, ID2, total, (CASE
> WHEN ID1 IS NULL AND ID2 IS NULL THEN '総計'→NULL
> WHEN ID1 IS NULL OR ID2 IS NULL THEN '小計'→NULL
> ELSE apple_name , banana_name END) AS apple_name FROM (
> ↑
>           追加した部分
>
> このようにELSEの後に追加した結果エラーがでました。
> 増やすことはできないのでしょうか?

ということであれば同じcase句を2項目分書くか(若干冗長ですが)
apple_nameとbanana_name文字連結して一つの項目として出す(副問合わせの時点でやらないと厳しいかもしれませんが)
とかですかね。
見づらくならないように間にスペース1文字とか入れた方がいいでしょうけど。
少なくともカンマは項目区切りの意味の予約語だから項目内の区切りには使えないでしょ。
エスケープしない限り。
引用返信 編集キー/
■92560 / inTopicNo.12)  Re[6]: SQLについて
□投稿者/ 初心者 (19回)-(2019/10/04(Fri) 16:16:09)
No92559 (大谷刑部 さん) に返信

> ということであれば同じcase句を2項目分書くか(若干冗長ですが)
> apple_nameとbanana_name文字連結して一つの項目として出す(副問合わせの時点でやらないと厳しいかもしれませんが)
> とかですかね。

項目をもっと増やすとなると今後大変なような気もします。
「副問合わせ」初めて聞いたので調べます。

もっと違うやり方で実装した方がいいんですかね…

> 見づらくならないように間にスペース1文字とか入れた方がいいでしょうけど。

スペースを入れたのですが何故か反映されず…見ずらくなってしまいすみません。
編集したのですがやり方が分からず、自分に返信する形になってしまいました。


引用返信 編集キー/
■92562 / inTopicNo.13)  Re[6]: SQLについて
□投稿者/ 魔界の仮面弁士 (2415回)-(2019/10/04(Fri) 16:22:47)
No92558 (初心者 さん) に返信
> 2項目分を出力したいということです。

こういうことでしょうか?(間違ってるかも)

MySQL は専門外なので、
「GROUP BY ID1, ID2 WITH ROLLUP」と
「GROUP BY ID1, ID2, apple_name WITH ROLLUP」
「GROUP BY ID1, ID2, apple_name, banana_name WITH ROLLUP」
の違いは良く分かっていません。


********* 案1 *********
SELECT
  ID1, ID2, total
, CASE WHEN ID1 IS NULL AND ID2 IS NULL THEN '総計' WHEN ID1 IS NULL OR ID2 IS NULL THEN '小計' ELSE apple_name  END AS apple_name
, CASE WHEN ID1 IS NULL AND ID2 IS NULL THEN '総計' WHEN ID1 IS NULL OR ID2 IS NULL THEN '小計' ELSE banana_name END AS banana_name 
FROM (
  SELECT ID1, ID2, apple_name, banana_name
  , SUM(money) AS total
  FROM tbl_name
  GROUP BY ID1, ID2 /* , apple_name, banana_name */
  WITH ROLLUP
) AS sq


********* 案2 *********
WITH Q1 AS (
  SELECT
    ID1, ID2, apple_name, banana_name
  , SUM(money) AS total
  FROM
    tbl_name
  GROUP BY
    ID1, ID2 /* , apple_name, banana_name */
  WITH ROLLUP
), Q2 AS (
  SELECT
    Q1.*, CASE
      WHEN Q1.ID1 IS NULL AND Q1.ID2 IS NULL THEN '総計'
      WHEN Q1.ID1 IS NULL  OR Q1.ID2 IS NULL THEN '小計'
    END AS TITLE
  FROM Q1
)
SELECT 
    ID1, ID2, total
  , IFNULL(title, apple_name) AS apple_name
  , IFNULL(title, banana_name) AS apple_name
FROM Q2

引用返信 編集キー/
■92563 / inTopicNo.14)  Re[7]: SQLについて
□投稿者/ 大谷刑部 (35回)-(2019/10/04(Fri) 16:32:35)
No92560 (初心者 さん) に返信
> ■No92559 (大谷刑部 さん) に返信
>
>>ということであれば同じcase句を2項目分書くか(若干冗長ですが)
>>apple_nameとbanana_name文字連結して一つの項目として出す(副問合わせの時点でやらないと厳しいかもしれませんが)
>>とかですかね。
>
> 項目をもっと増やすとなると今後大変なような気もします。
弁さんの案1と同一。でもこれがオーソドックスなやり方ですよ。

> 「副問合わせ」初めて聞いたので調べます。
副問合わせ=サブクエリ
つまりFrom句のかっこ以降のselect文のことです。

>
> もっと違うやり方で実装した方がいいんですかね…
>
>>見づらくならないように間にスペース1文字とか入れた方がいいでしょうけど。
>
> スペースを入れたのですが何故か反映されず…見ずらくなってしまいすみません。
どうやりましたか?

concat(apple_name,' ',banana_name)

apple_name || ' ' || banana_name

をas ab_name

とかにすればいいと言っているだけですが。

引用返信 編集キー/
■92564 / inTopicNo.15)  Re[8]: SQLについて
□投稿者/ 初心者 (20回)-(2019/10/07(Mon) 09:10:20)
No92563 (大谷刑部 さん) に返信

> 弁さんの案1と同一。でもこれがオーソドックスなやり方ですよ。

そうなんですね、こちらのやり方でやってみたいと思います。

> 副問合わせ=サブクエリ
> つまりFrom句のかっこ以降のselect文のことです。

サブクエリのことでしたか!
副問合わせともいうんですね。勉強になりました。

> どうやりましたか?
>
> concat(apple_name,' ',banana_name)
> か
> apple_name || ' ' || banana_name
>
> をas ab_name
>
> とかにすればいいと言っているだけですが。

すみません、勘違いしてました。

引用返信 編集キー/
■92565 / inTopicNo.16)  Re[7]: SQLについて
□投稿者/ 初心者 (21回)-(2019/10/07(Mon) 09:12:19)
No92562 (魔界の仮面弁士 さん) に返信
> ■No92558 (初心者 さん) に返信
>>2項目分を出力したいということです。
>
> こういうことでしょうか?(間違ってるかも)
>
> MySQL は専門外なので、
> 「GROUP BY ID1, ID2 WITH ROLLUP」と
> 「GROUP BY ID1, ID2, apple_name WITH ROLLUP」
> 「GROUP BY ID1, ID2, apple_name, banana_name WITH ROLLUP」
> の違いは良く分かっていません。
>
>
> ********* 案1 *********
> SELECT
> ID1, ID2, total
> , CASE WHEN ID1 IS NULL AND ID2 IS NULL THEN '総計' WHEN ID1 IS NULL OR ID2 IS NULL THEN '小計' ELSE apple_name END AS apple_name
> , CASE WHEN ID1 IS NULL AND ID2 IS NULL THEN '総計' WHEN ID1 IS NULL OR ID2 IS NULL THEN '小計' ELSE banana_name END AS banana_name
> FROM (
> SELECT ID1, ID2, apple_name, banana_name
> , SUM(money) AS total
> FROM tbl_name
> GROUP BY ID1, ID2 /* , apple_name, banana_name */
> WITH ROLLUP
> ) AS sq
>
>
> ********* 案2 *********
> WITH Q1 AS (
> SELECT
> ID1, ID2, apple_name, banana_name
> , SUM(money) AS total
> FROM
> tbl_name
> GROUP BY
> ID1, ID2 /* , apple_name, banana_name */
> WITH ROLLUP
> ), Q2 AS (
> SELECT
> Q1.*, CASE
> WHEN Q1.ID1 IS NULL AND Q1.ID2 IS NULL THEN '総計'
> WHEN Q1.ID1 IS NULL OR Q1.ID2 IS NULL THEN '小計'
> END AS TITLE
> FROM Q1
> )
> SELECT
> ID1, ID2, total
> , IFNULL(title, apple_name) AS apple_name
> , IFNULL(title, banana_name) AS apple_name
> FROM Q2

ありがとうございます。
参考に、やってみたいと思います。
結果報告が少々遅れてしまうと思うのですが、ご了承下さい。

引用返信 編集キー/
■92567 / inTopicNo.17)  Re[7]: SQLについて
□投稿者/ 初心者 (22回)-(2019/10/07(Mon) 11:16:34)
No92562 (魔界の仮面弁士 さん) に返信

> ********* 案1 *********
> SELECT
> ID1, ID2, total
> , CASE WHEN ID1 IS NULL AND ID2 IS NULL THEN '総計' WHEN ID1 IS NULL OR ID2 IS NULL THEN '小計' ELSE apple_name END AS apple_name
> , CASE WHEN ID1 IS NULL AND ID2 IS NULL THEN '総計' WHEN ID1 IS NULL OR ID2 IS NULL THEN '小計' ELSE banana_name END AS banana_name
> FROM (
> SELECT ID1, ID2, apple_name, banana_name
> , SUM(money) AS total
> FROM tbl_name
> GROUP BY ID1, ID2 /* , apple_name, banana_name */
> WITH ROLLUP
> ) AS sq

案1の方で実装できました。
ありがとうございました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ