• ベストアンサー

クロス集計?

お世話になっております。 SQLで表にしたいのですが、行き詰まっています。 (テーブル名:作業時間テーブル) 従業員No|工程数|作業時間|休憩時間|就業時間 3 |2 |100 | 10 |110 4 |3 |120 | 10 |130 8 |1 | 50 | 20 | 70 8 |4 | 70 | 20 | 90 (テーブル名:工程マスタ) 工程数|工程名 1 |AAA 2 |BBB 3 |CCC 4 |DDD このようなふたつのテーブルがあります。 作業時間テーブルの表示の仕方を変えて、 作業者No|工程1作業時間|工程2作業時間|工程3作業時間|工程4作業時間|休憩時間|就業時間 3 | 0 |100 | 0 | 0 | 10 |110 4 | 0 | 0 |120 | 0 | 10 |130 8 | 50 | 0 | 0 | 70 | 40 |160 このようにしたいと思います。 工程数は、マスタでもってる工程数で決まります。 (工程名は使いません) このようなことは可能でしょうか? 可能であるならどのように書けばいいでしょうか? クロス集計というのがあるのを見つけて調べてみたのですが、 いい方法が見つかりませんでした。 データベースはSQL Server2005です。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

select 従業員No ,sum(k1) as 工程1作業時間 ,sum(k2) as 工程2作業時間 ,sum(k3) as 工程3作業時間 ,sum(k4) as 工程4作業時間 ,sum(休憩時間) as 休憩時間 ,sum(就業時間) as 就業時間 from( select 従業員No ,case when 工程数 = 1 then sum(作業時間) else 0 end as k1 ,case when 工程数 = 2 then sum(作業時間) else 0 end as k2 ,case when 工程数 = 3 then sum(作業時間) else 0 end as k3 ,case when 工程数 = 4 then sum(作業時間) else 0 end as k4 ,休憩時間 ,sum(就業時間) as 就業時間 from a group by 従業員No,工程数,休憩時間 ) group by 従業員No "従業員NO","工程1作業時間","工程2作業時間","工程3作業時間","工程4作業時間","休憩時間","就業時間" "3","0","100","0","0","10","110" "4","0","0","120","0","10","130" "8","50","0","0","70","40","160"

nanaki_n
質問者

お礼

回答ありがとうございます。 これでできました。 書いてるのはVBなので工程のところはForでまわしました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

クロス集計クエリはAccess独特のもので、SQL Server ではサポート されていないはずです。 解決案は2通りあります。 (1)Accessがインストールされている場合  AccessにSQLServerのDBをリンクし、クロス集計クエリを作る。 (2)Accessが無い場合  独自にSQLを作る。この場合、工程1、工程2は固定になり、マスタが  変更される度に修正が必要になる。

nanaki_n
質問者

お礼

回答ありがとうございます。 クロス集計はAccess独特のものだったんですね。 cross joinのことかと思っていたのですが、勘違いしていました。 調べてAccessでクロス集計をやってみました。 ウィザードで作って、Accessで作ってくれたSQLで試してみましたが、PIVOTというのがAccess独特のものみたいですね。SQL Serverではエラーになりました。 勉強になりました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
noname#94983
noname#94983
回答No.1

これだけだとちょっとよくわからないのだが、SQLServerにデータはあるとして、当然、そこにクエリーを発行してレコードを取得し表示する処理を何かで書いていると思う。この部分は、何を使ってどう処理しているんだろうか。 肝心なのは、その部分になるわけで、そこで「こうやって一覧を出力している」という部分がわかれば、そこを書き換えればいいだけだろう。見たところ、特に2つのテーブルをJOINする必要があるわけではなく、単に取得した1テーブルの表示の仕方の問題のように思える。ならば、レコードを出力する際に、工程数に応じて出力内容を変えるようにするだけですむはずだ。

nanaki_n
質問者

お礼

回答ありがとうございます。 日中書き込みできなくて遅くなりました。すみません。 VB2008 Expressを使ってます。 ソースにSQL書いてDBに投げてます。 Selectで取得したデータをDataTableに入れてそのままDataGridViewに表示させています。 DataGridViewはSelectで取得した形をそのまま表示できるので、できればSQLでなんとかならないかと考えていました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 同じ列に2行づつで出力するSQL

    次のようなテーブルがあったとき no | name 1 | aaa 3 | bbb 4 | ccc 6 | ddd (先頭はカラム名です) 以下のように出力するSQLは書けますでしょうか? no1| name1 | no2| name2 1 | aaa | 3 | bbb 4 | ccc | 6 | ddd

  • 集計方法について教えて下さい。PHP+MYSQL

    こんばんは。よろしくお願い致します。 データベースに下記のようなデータが入っています。 no point name --------------------- 123 100 aaa 123 50 aaa 124 100 bbb 130 30 ccc 131 80 ddd 131 100 ddd 131 20 ddd 133 10 eee このデータを元に、下記のような結果を得たいのです。 noが同じデータのpointを集計し、まとめたレコードの件数をcount項目として欲しいです。 no point name count ------------------------------ 123 150 aaa 2 124 100 bbb 1 130 30 ccc 1 131 200 ddd 3 133 10 eee 1 SQLだけで実現できるのでしょうか?? 具体的にどのような方法で実現できるか、教えて頂けると有難いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • SQL文を教えてください。

    すみません、SQLを教えてください。 ID, 名前の2つのフィールドを持つテーブルがあります。 中身は以下のように入っています。 1, AAA 2. AAA 2, BBB 3, CCC 3, AAA 4, DDD 5, EEE, 5, DDD これを、名前のダブリをスキップしながら、 IDの大きな順番に名前を取り出したいのです。 結果は、以下のようになればいいです。 DDD EEE AAA CCC BBB どのようなSQLを組んだら実現できますか? よろしくお願いいたします。

  • 複数テーブルへの更新、挿入について

    複数テーブルへの更新、挿入について教えてください。 現在2つのテーブルがあり、それぞれのテーブルに対して更新処理をかけています。 その処理を一回のSQLで更新できないものかと考えています。 以下のような二つのテーブルに対して一度にIntoできるものなのでしょうか。 よろしくお願いします。 --Teble1-- No Name Post ID 1 aaa bbb 1 2 aaa bbb 2 3 aaa bbb 3 --Teble2-- NO ID Memo 1 1 ccc 2 1 ccc 3 1 ccc 2 2 ccc 3 2 ccc

  • オラクルで

    オラクルのSQLでの質問ですが、 2つのテーブルに同じ名前の列があります。 TEMP1         TEMP2 ----------      ------------- NAME CODE      NAME  NUM aaa   1         ccc   5 bbb   2         ddd   10 この2つのテーブルを検索して、同じ列として表示したいのですが 可能なのでしょうか? NAME ----------- aaa bbb ccc ddd このようにしたいのですが、ビューなどは使ってかまわないのですが 方法がありましたら教えてください。

  • SQL文 テーブル1つに複数のデータ

    お世話になっております。 SQLでの質問です。 --テーブル---------- F_1 F_2 AAA BBB AAA CCC BBB XXX CCC DDD DDD YYY 1.F_1のAAAを条件にF_2のBBB・CCCを取得し、 F_1のBBB・CCCと、F_2のXXXとDDDを取得します。 2.次に、取得したF_2のXXX・DDDを条件に、F_1のDDD、F_2のYYYを取得します。 これを1つのSQLで実行したいのですが、副問合せを駆使しても、良いSQLが思い浮かびません。 有識者の方、ご享受頂きたいです。 宜しくお願い致します。

  • 異なるテーブルのレコード削除

    オラクル初心者です。宜しくお願いします。 AAA、BBB、CCCというテーブルがあると仮定します。 画面から入力された値(ddd)をキーとして、CCCテーブルから該当するレコードをセレクト文で引っ張り、eeeという値を抜き出したとします。 そのeeeという値をキーにAAA、BBBテーブルのレコードを削除するにはどういうSQLを発行すればよろしいでしょうか? "delete from AAA, BBB where eee = (select eee from CCC where fff = ddd);" では駄目でした。 質問が下手でわかりにくいかもしれませんが、どうかご教授お願いします。

  • AccessSQL 1つのテーブルに複数のデータ

    お世話になっております。 アクセスSQLでの質問です。 --テーブル---------- F_1 F_2 AAA BBB AAA CCC BBB XXX CCC DDD DDD YYY 1.F_1のAAAを条件にF_2のBBB・CCCを取得し、 F_1のBBB・CCCと、F_2のXXXとDDDを取得します。 次に、取得したF_2のXXX・DDDを条件に、F_1のDDD、F_2のYYYを取得します。 つまり、AAAを取得した結果、SQL一つで、上記テーブルデータをF_1:AAA以外、取得したい要件です。 有識者の方、ご享受頂きたいです。 宜しくお願い致します 【自力で考えた結果】 -------------------------- select F_MenuCD,F_ZaiCD from [TABLE] where F_MenuCD IN ( SELECT F_ZaiCD FROM [TABLE] WHERE F_MenuCD IN ('AAA') ); F_1 F_2 BBB XXX CCC DDD を取得するSQLは上記でいけそうなのですが、 DDD YYY を、1つのSQLで取得したいのです。

  • SQLについて

    レコード1 |レコード2 |レコード3 AAA |1111 |0000 BBB |1111 |0000 CCC |2222 |2222 CCC |3333 |2222 CCC |4444 |2222 上記のようなテーブルがあった場合、レコード1のAAAとBBBは値をそのまま抽出し レコード1のDDDはレコード2とレコード3の値が一致しているものを抽出したいのですが ひとつのSQLで実現することは可能でしょうか? レコード2とレコード3の値が一致しているものを抽出だけなら簡単にできそうなのですが AAAとBBBもというところで悩んでます。どうかご教授ください。

  • SQLについてお聞きします

    フィールド1 |フィールド2 |フィールド3 AAA |1111 |0000 BBB |1111 |0000 CCC |2222 |2222 CCC |3333 |2222 CCC |4444 |2222 上記のようなテーブルがあった場合、フィールド1のAAAとBBBは値をそのまま抽出し フィールド1のDDDはフィールド2とフィールド3の値が一致しているものを抽出したいのですが ひとつのSQLで実現することは可能でしょうか? フィールド2とフィールド3の値が一致しているものを抽出だけなら簡単にできそうなのですが AAAとBBBもというところで悩んでます。どうかご教授ください。

このQ&Aのポイント
  • plala mailが使用できなくなり、再設定しても問題は解決しない状況です。
  • スマホでも同様の問題が発生し、メールの送受信ができません。
  • この問題に関しては、ひかりTVのサービスについての質問です。
回答を見る