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

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

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

Re[14]: 集計クエリーについて


(過去ログ 114 を表示中)

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

■67229 / inTopicNo.1)  集計クエリーについて
  
□投稿者/ yokodetown (1回)-(2013/07/18(Thu) 10:53:42)

分類:[C#] 

おせわになります。
開発環境は、os WindowsXp
使用言語  C#

SELECT文のみ、集計クエリー(GROUP BY句)のみはわかります。サブクエリーで考えればいいのでしょうか。サブクエリーではできないですよね。
宜しくお願いいたします。
Table1
コード  品名  在庫数
   1    みかん   3
   2    りんご   0
   3    いちご      2
   4    ぶどう      8
   5    なし     6
table2
コード  入荷数  販売数
   1       0        1
   2       0        0
   5          5     6
  1          3        0
   2          2        0

table1,table2を使って、SQLでほしい結果
コード  品名  在庫数   入荷数 販売数
   1    みかん   3          3       1
   2    りんご   0          2       0
   3    いちご      2          0       0 table2にデータがないときは、入荷数0、販売数0としたい
   4    ぶどう      8          0       0 table2にデータがないときは、入荷数0、販売数0としたい
   5    なし     6         5       6

引用返信 編集キー/
■67230 / inTopicNo.2)  Re[1]: 集計クエリーについて
□投稿者/ 魔界の仮面弁士 (263回)-(2013/07/18(Thu) 11:23:31)
No67229 (yokodetown さん) に返信
> SELECT文のみ、集計クエリー(GROUP BY句)のみはわかります。
これって、C# からの Linq の話では無く、データベースの話題でしょうか。
データベースだとしたら、どのデータベースでしょうか?

> table2にデータがないときは、入荷数0、販売数0としたい
LEFT JOIN で繋いだ後、NULL を 0 に置き換えれば良いかと。

CASE 式を使うという手もありますし、あるいは
Access なら Nz関数、JET なら IIF + ISNULL、
MSSQL なら ISNULL、Oracle なら NVLまたはDECODEなど。
引用返信 編集キー/
■67234 / inTopicNo.3)  Re[2]: 集計クエリーについて
□投稿者/ yokodetown (2回)-(2013/07/18(Thu) 14:16:32)
No67230 (魔界の仮面弁士 さん) に返信
> ■No67229 (yokodetown さん) に返信
>>SELECT文のみ、集計クエリー(GROUP BY句)のみはわかります。
> これって、C# からの Linq の話では無く、データベースの話題でしょうか。
> データベースだとしたら、どのデータベースでしょうか?
>
>>table2にデータがないときは、入荷数0、販売数0としたい
> LEFT JOIN で繋いだ後、NULL を 0 に置き換えれば良いかと。
>
> CASE 式を使うという手もありますし、あるいは
> Access なら Nz関数、JET なら IIF + ISNULL、
> MSSQL なら ISNULL、Oracle なら NVLまたはDECODEなど。
引用返信 編集キー/
■67235 / inTopicNo.4)  Re[3]: 集計クエリーについて
□投稿者/ yokodetown (3回)-(2013/07/18(Thu) 14:23:06)
No67234 (yokodetown さん) に返信
> ■No67230 (魔界の仮面弁士 さん) に返信
>>■No67229 (yokodetown さん) に返信
> >>SELECT文のみ、集計クエリー(GROUP BY句)のみはわかります。
>>これって、C# からの Linq の話では無く、データベースの話題でしょうか。
>>データベースだとしたら、どのデータベースでしょうか?
>>
> >>table2にデータがないときは、入荷数0、販売数0としたい
>>LEFT JOIN で繋いだ後、NULL を 0 に置き換えれば良いかと。
>>
>>CASE 式を使うという手もありますし、あるいは
>>Access なら Nz関数、JET なら IIF + ISNULL、
>>MSSQL なら ISNULL、Oracle なら NVLまたはDECODEなど。

魔界の仮面弁士 さん
はじめてこの掲示板を使うので間違って送信してしまいました。申し訳ありません。
早速ご回答いただきまして有難うございます。
データベースはSQL Server2008R2です。教えていただいたLEFT JOINを使うとよくわかりませんが
このようになるのでしょうか。

   SELECT コード, 品名, 在庫数, IsNULL(入荷数,0), IsNULL(販売数,0)
   FROM table1 LEFT JOIN table2 USING (table1.コード=table2.コード) GROUP BY table2.コード

引用返信 編集キー/
■67236 / inTopicNo.5)  Re[4]: 集計クエリーについて
□投稿者/ 魔界の仮面弁士 (264回)-(2013/07/18(Thu) 14:40:38)
No67235 (yokodetown さん) に返信
> データベースはSQL Server2008R2です。教えていただいたLEFT JOINを使うとよくわかりませんが
> このようになるのでしょうか。

SELECT
  table1.コード
, table1.品名
, table1.在庫数
, IsNULL(table0.入荷数, 0) 入荷数
, IsNULL(table0.販売数,0) 販売数
FROM table1 LEFT JOIN (SELECT
  table2.コード
, SUM(table2.入荷数) 入荷数
, SUM(table2.販売数) 販売数
FROM table2 GROUP BY table2.コード) table0
ON table1.コード = table0.コード

かな? 未検証。

引用返信 編集キー/
■67242 / inTopicNo.6)  Re[5]: 集計クエリーについて
□投稿者/ yokodetown (4回)-(2013/07/18(Thu) 16:54:05)
No67236 (魔界の仮面弁士 さん) に返信
> ■No67235 (yokodetown さん) に返信
>>データベースはSQL Server2008R2です。教えていただいたLEFT JOINを使うとよくわかりませんが
>>このようになるのでしょうか。
>
> SELECT
> table1.コード
> , table1.品名
> , table1.在庫数
> , IsNULL(table0.入荷数, 0) 入荷数
> , IsNULL(table0.販売数,0) 販売数
> FROM table1 LEFT JOIN (SELECT
> table2.コード
> , SUM(table2.入荷数) 入荷数
> , SUM(table2.販売数) 販売数
> FROM table2 GROUP BY table2.コード) table0  
> ON table1.コード = table0.コード
>
> かな? 未検証。

table0とtable1とtable2があってよく理解できません。もう少しがんばってみます。

実際のデータベースでやろうと思いましたら、伝票日付(入荷日、販売日)で抽出しなければならないことになりました。
そのときは
> , SUM(table2.入荷数) 入荷数
> , SUM(table2.販売数) 販売数
> FROM table2

 WHERE 伝票日付 like '2013/07/%' ←ここに入れればいいんでしょうか。(7月の入荷数、販売数)

GROUP BY table2.コード) table0  
> ON table1.コード = table0.コード
>

引用返信 編集キー/
■67243 / inTopicNo.7)  Re[6]: 集計クエリーについて
□投稿者/ しま (13回)-(2013/07/18(Thu) 19:18:11)
No67242 (yokodetown さん) に返信
>
> 実際のデータベースでやろうと思いましたら、伝票日付(入荷日、販売日)で抽出しなければならないことになりました。
>>FROM table2
>
>  WHERE 伝票日付 like '2013/07/%' ←ここに入れればいいんでしょうか。(7月の入荷数、販売数)
>
> GROUP BY table2.コード) table0  
>>ON table1.コード = table0.コード
>>
>
伝票日付の型と、どの表(テーブル)に属するのか不明なので仮に日付型で table2 の列名だと仮定したら
(like は文字列に使うものなので...)
where table2.伝票日付 between '2013/7/1' and '2013/7/31' の方がよさそうに思います

それよりも、table1 と table2 との性質がはっきりしないのでどういう集計の仕方が適切なのかは
判断しかねます。商品、在庫、売上伝票など用途、目的が違えば集計の仕方も違ってくると思います。
table2 は入荷伝票と売上伝票とからの日別の集計結果のように見えますし、table1 は日別の在庫数(その日の当初残か最終残かは判らないが)のように見えます。
もしそうなら、group by は必要ないでしょう。
引用返信 編集キー/
■67248 / inTopicNo.8)  Re[7]: 集計クエリーについて
□投稿者/ yokodetown (5回)-(2013/07/19(Fri) 09:21:45)
No67243 (しま さん) に返信
> ■No67242 (yokodetown さん) に返信
>>
>>実際のデータベースでやろうと思いましたら、伝票日付(入荷日、販売日)で抽出しなければならないことになりました。
> >>FROM table2
>>
>> WHERE 伝票日付 like '2013/07/%' ←ここに入れればいいんでしょうか。(7月の入荷数、販売数)
>>
>>GROUP BY table2.コード) table0  
> >>ON table1.コード = table0.コード
> >>
> >
> 伝票日付の型と、どの表(テーブル)に属するのか不明なので仮に日付型で table2 の列名だと仮定したら
> (like は文字列に使うものなので...)
> where table2.伝票日付 between '2013/7/1' and '2013/7/31' の方がよさそうに思います
>
> それよりも、table1 と table2 との性質がはっきりしないのでどういう集計の仕方が適切なのかは
> 判断しかねます。商品、在庫、売上伝票など用途、目的が違えば集計の仕方も違ってくると思います。
> table2 は入荷伝票と売上伝票とからの日別の集計結果のように見えますし、table1 は日別の在庫数(その日の当初残か最終残かは判らないが)のように見えます。
> もしそうなら、group by は必要ないでしょう。

しまさん
ご回答ありがとうございます。
もう少しわかりやすく説明すると table1は現時点での在庫
                table2は入荷及び出荷明細テーブル
table1,table2を使って、SQLで結果を取得しDbGridViewに表示を考えています。
GROUP BYがなくてはできないような気がします。宜しくお願いいたします。
確認しましたら伝票日付はVarChar(10)になっていました。

少し替えましたが再掲
Table1
コード  品名  在庫数
1 みかん   3
2 りんご   0
3 いちご 2
4 ぶどう 8
5 なし    6
table2
コード  入荷数  販売数 伝票日付
1     1   2013/07/03 
5 1     2013/07/09
 1 3 2013/07/15
1 2 2013/06/16
2 2 2013/07/12
5 4 2013/07/10
5 6 2013/07/11
table1,table2を使って、SQLでほしい結果
コード  品名  在庫数 入荷数 販売数
1 みかん   3 5 1
2 りんご   0 2 0
3 いちご 2 0 0 table2にデータがないときは、入荷数0、販売数0としたい
4 ぶどう 8 0 0 table2にデータがないときは、入荷数0、販売数0としたい
5 なし    6  5 6


引用返信 編集キー/
■67257 / inTopicNo.9)  Re[8]: 集計クエリーについて
□投稿者/ しま (14回)-(2013/07/19(Fri) 12:15:55)
No67248 (yokodetown さん) に返信
> もう少しわかりやすく説明すると table1は現時点での在庫
>                 table2は入荷及び出荷明細テーブル
> table1,table2を使って、SQLで結果を取得しDbGridViewに表示を考えています。
> GROUP BYがなくてはできないような気がします。宜しくお願いいたします。
> 確認しましたら伝票日付はVarChar(10)になっていました。
>
> 少し替えましたが再掲
> Table1
> コード  品名  在庫数
> 1 みかん   3
> 2 りんご   0
> 3 いちご 2
> 4 ぶどう 8
> 5 なし    6
> table2
> コード  入荷数  販売数 伝票日付
> 1     1   2013/07/03 
> 5 1     2013/07/09
>  1 3 2013/07/15
> 1 2 2013/06/16
> 2 2 2013/07/12
> 5 4 2013/07/10
> 5 6 2013/07/11
> table1,table2を使って、SQLでほしい結果
> コード  品名  在庫数 入荷数 販売数
> 1 みかん   3 5 1
> 2 りんご   0 2 0
> 3 いちご 2 0 0 table2にデータがないときは、入荷数0、販売数0としたい
> 4 ぶどう 8 0 0 table2にデータがないときは、入荷数0、販売数0としたい
> 5 なし    6  5 6
>
>
魔界の仮面弁士 さんのクエリーと基本的には同じ(日付の範囲指定が増えただけ)ですが、次の様なクエリーでいいのではないでしょうか

select AA.コード, AA.品名, AA.在庫数, isnull(BB.入荷数,0) as 入荷数, isnull(BB.販売数,0) as 販売数
from Table1 AA left join (
select CC.コード, sum(CC.入荷数) as 入荷数, sum(CC.販売数) as 販売数 from Table2 CC
where CC.伝票日付 between '2013/07/01' and '2013/07/31'
group by CC.コード
) BB on AA.コード=BB.コード

引用返信 編集キー/
■67260 / inTopicNo.10)  Re[9]: 集計クエリーについて
□投稿者/ yokodetown (6回)-(2013/07/19(Fri) 14:00:24)
No67257 (しま さん) に返信
> ■No67248 (yokodetown さん) に返信
>>もう少しわかりやすく説明すると table1は現時点での在庫
>>                table2は入荷及び出荷明細テーブル
>>table1,table2を使って、SQLで結果を取得しDbGridViewに表示を考えています。
>>GROUP BYがなくてはできないような気がします。宜しくお願いいたします。
>>確認しましたら伝票日付はVarChar(10)になっていました。
>>
>>少し替えましたが再掲
>>Table1
>>コード  品名  在庫数
>> 1 みかん   3
>> 2 りんご   0
>> 3 いちご 2
>> 4 ぶどう 8
>> 5 なし    6
>>table2
>>コード  入荷数  販売数 伝票日付
>> 1     1   2013/07/03 
>> 5 1     2013/07/09
>>  1 3 2013/07/15
>> 1 2 2013/06/16
>> 2 2 2013/07/12
>> 5 4 2013/07/10
>> 5 6 2013/07/11
>>table1,table2を使って、SQLでほしい結果
>>コード  品名  在庫数 入荷数 販売数
>> 1 みかん   3 5 1
>> 2 りんご   0 2 0
>> 3 いちご 2 0 0 table2にデータがないときは、入荷数0、販売数0としたい
>> 4 ぶどう 8 0 0 table2にデータがないときは、入荷数0、販売数0としたい
>> 5 なし    6  5 6
>>
> >
> 魔界の仮面弁士 さんのクエリーと基本的には同じ(日付の範囲指定が増えただけ)ですが、次の様なクエリーでいいのではないでしょうか
>
> select AA.コード, AA.品名, AA.在庫数, isnull(BB.入荷数,0) as 入荷数, isnull(BB.販売数,0) as 販売数
> from Table1 AA left join (
> select CC.コード, sum(CC.入荷数) as 入荷数, sum(CC.販売数) as 販売数 from Table2 CC
> where CC.伝票日付 between '2013/07/01' and '2013/07/31'
> group by CC.コード
> ) BB on AA.コード=BB.コード
>

有難うございます。質問ですがAAはtable1をBBはtable2を指していると思いますが、CCはなんでしょうか?
どこからCCが出てくるのでしょうか。CCはBBと同じですか(table2に格納されているから)?宜しくお願いいたします。
引用返信 編集キー/
■67265 / inTopicNo.11)  Re[10]: 集計クエリーについて
□投稿者/ しま (15回)-(2013/07/19(Fri) 14:29:43)
No67260 (yokodetown さん) に返信
> 有難うございます。質問ですがAAはtable1をBBはtable2を指していると思いますが、CCはなんでしょうか?
> どこからCCが出てくるのでしょうか。CCはBBと同じですか(table2に格納されているから)?宜しくお願いいたします。

AA は table1 の、CC は table2 の別名(alias) です
BB は AA に結合(ここでは left join)するためのサブクエリーの別名(alias)です
別名についてはご自分でお勉強なさってください。
引用返信 編集キー/
■67268 / inTopicNo.12)  Re[11]: 集計クエリーについて
□投稿者/ yokodetown (7回)-(2013/07/19(Fri) 21:12:15)
No67265 (しま さん) に返信

しまさん  魔界の仮面弁士さん 有難うございました。

SQL Server Management Studioで実際のデータを使って動作しました。

やってみたら、あとは在庫数,入荷数,販売数すべてが '0'のときにはそのコード( 1 LINE )は
表示させたくないのですがこのクエリーでは出来そうにもないですね。
引用返信 編集キー/
■67283 / inTopicNo.13)  Re[12]: 集計クエリーについて
□投稿者/ しま (16回)-(2013/07/21(Sun) 22:53:38)
No67268 (yokodetown さん) に返信
> SQL Server Management Studioで実際のデータを使って動作しました。
>
> やってみたら、あとは在庫数,入荷数,販売数すべてが '0'のときにはそのコード( 1 LINE )は
> 表示させたくないのですがこのクエリーでは出来そうにもないですね。

なぜ、出来そうにないと判断できたのでしょうか?

工夫すれば出来ると思います。
引用返信 編集キー/
■67285 / inTopicNo.14)  Re[12]: 集計クエリーについて
□投稿者/ 魔界の仮面弁士 (265回)-(2013/07/21(Sun) 23:47:27)
No67268 (yokodetown さん) に返信
> やってみたら、あとは在庫数,入荷数,販売数すべてが '0'のときにはそのコード( 1 LINE )は
> 表示させたくないのですがこのクエリーでは出来そうにもないですね。

HAVING なり WHERE なりで絞り込みましょう。今回は join した結果に対して WHERE するのが良いかな。
引用返信 編集キー/
■67291 / inTopicNo.15)  Re[13]: 集計クエリーについて
□投稿者/ yokodetown (8回)-(2013/07/23(Tue) 09:28:12)
No67283 (しま さん) に返信
> ■No67268 (yokodetown さん) に返信
>>SQL Server Management Studioで実際のデータを使って動作しました。
>>
>>やってみたら、あとは在庫数,入荷数,販売数すべてが '0'のときにはそのコード( 1 LINE )は
>>表示させたくないのですがこのクエリーでは出来そうにもないですね。
>
> なぜ、出来そうにないと判断できたのでしょうか?
>
> 工夫すれば出来ると思います。

しまさん 有難うございます。
出来るということなので頑張ってみます。またよろしくお願いいたします。
引用返信 編集キー/
■67292 / inTopicNo.16)  Re[13]: 集計クエリーについて
□投稿者/ yokodetown (9回)-(2013/07/23(Tue) 09:45:47)
No67285 (魔界の仮面弁士 さん) に返信
> ■No67268 (yokodetown さん) に返信
>>やってみたら、あとは在庫数,入荷数,販売数すべてが '0'のときにはそのコード( 1 LINE )は
>>表示させたくないのですがこのクエリーでは出来そうにもないですね。
>
> HAVING なり WHERE なりで絞り込みましょう。今回は join した結果に対して WHERE するのが良いかな。

魔界の仮面弁士 さん  有難うございます。
ご回答いただいたあと、実際のデータベースを使って、SQL Server Manegement Studioにて、
どこに"WHERE"を入れればよいか1日思考錯誤しながらトライしましたが、今のところわかりません。
もう少しやってみます。またよろしくお願いいたします。

以下のクエリーにWHEREを使おうとしています。
SELECT
table1.コード
, table1.品名
, table1.在庫数
, IsNULL(table0.入荷数, 0) 入荷数
, IsNULL(table0.販売数,0) 販売数
FROM table1 LEFT JOIN (SELECT
table2.コード
, SUM(table2.入荷数) 入荷数
, SUM(table2.販売数) 販売数
FROM table2
WHERE table2.伝票日付 like '2013/07/%'
GROUP BY table2.コード) table0
ON table1.コード = table0.コード
引用返信 編集キー/
■67295 / inTopicNo.17)  Re[14]: 集計クエリーについて
□投稿者/ yokodetown (10回)-(2013/07/23(Tue) 13:12:55)
No67292 (yokodetown さん) に返信
> ■No67285 (魔界の仮面弁士 さん) に返信
>>■No67268 (yokodetown さん) に返信
> >>やってみたら、あとは在庫数,入荷数,販売数すべてが '0'のときにはそのコード( 1 LINE )は
> >>表示させたくないのですがこのクエリーでは出来そうにもないですね。
>>
>>HAVING なり WHERE なりで絞り込みましょう。今回は join した結果に対して WHERE するのが良いかな。
>
> 魔界の仮面弁士 さん  有難うございます。
> ご回答いただいたあと、実際のデータベースを使って、SQL Server Manegement Studioにて、
> どこに"WHERE"を入れればよいか1日思考錯誤しながらトライしましたが、今のところわかりません。
> もう少しやってみます。またよろしくお願いいたします。
>
> 以下のクエリーにWHEREを使おうとしています。
> SELECT
> table1.コード
> , table1.品名
> , table1.在庫数
> , IsNULL(table0.入荷数, 0) 入荷数
> , IsNULL(table0.販売数,0) 販売数
> FROM table1 LEFT JOIN (SELECT
> table2.コード
> , SUM(table2.入荷数) 入荷数
> , SUM(table2.販売数) 販売数
> FROM table2
> WHERE table2.伝票日付 like '2013/07/%'
> GROUP BY table2.コード) table0
> ON table1.コード = table0.コード

魔界の仮面弁士 さん 出来ました。
SELECT
table1.コード
, table1.品名
, table1.在庫数
, IsNULL(table0.入荷数, 0) 入荷数
, IsNULL(table0.販売数,0) 販売数
FROM table1 LEFT JOIN (SELECT
table2.コード
, SUM(table2.入荷数) 入荷数
, SUM(table2.販売数) 販売数
FROM table2
WHERE table2.伝票日付 like '2013/07/%'
GROUP BY table2.コード) table0
ON table1.コード = table0.コード
WHERE (table0.入荷数<>0 or (table0.販売数<>0) or (table1.在庫数<>0)
これで実際のデータベースにアクセスし、DataGridViewに表示できました。
非バインドで表示していますが(非バインドの方がいい)
SQLを書くだけでバインドできる方法ってあるのでしょうか(でたらめ言っているかも)
これでできましたので解決済とさせていただきます。有難うございました。 

引用返信 編集キー/
■67296 / inTopicNo.18)  Re[14]: 集計クエリーについて
□投稿者/ yokodetown (11回)-(2013/07/23(Tue) 13:14:18)
No67291 (yokodetown さん) に返信
> ■No67283 (しま さん) に返信
>>■No67268 (yokodetown さん) に返信
> >>SQL Server Management Studioで実際のデータを使って動作しました。
> >>
> >>やってみたら、あとは在庫数,入荷数,販売数すべてが '0'のときにはそのコード( 1 LINE )は
> >>表示させたくないのですがこのクエリーでは出来そうにもないですね。
>>
>>なぜ、出来そうにないと判断できたのでしょうか?
>>
>>工夫すれば出来ると思います。
>
> しまさん 有難うございます。
> 出来るということなので頑張ってみます。またよろしくお願いいたします。

しまさん 出来ました。有難うございました。これで解決済とさせていただきます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -