- ベストアンサー
クロス集計?
お世話になっております。 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です。 よろしくお願い致します。
- みんなの回答 (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"
その他の回答 (2)
- nda23
- ベストアンサー率54% (777/1415)
クロス集計クエリはAccess独特のもので、SQL Server ではサポート されていないはずです。 解決案は2通りあります。 (1)Accessがインストールされている場合 AccessにSQLServerのDBをリンクし、クロス集計クエリを作る。 (2)Accessが無い場合 独自にSQLを作る。この場合、工程1、工程2は固定になり、マスタが 変更される度に修正が必要になる。
お礼
回答ありがとうございます。 クロス集計はAccess独特のものだったんですね。 cross joinのことかと思っていたのですが、勘違いしていました。 調べてAccessでクロス集計をやってみました。 ウィザードで作って、Accessで作ってくれたSQLで試してみましたが、PIVOTというのがAccess独特のものみたいですね。SQL Serverではエラーになりました。 勉強になりました。ありがとうございました。
これだけだとちょっとよくわからないのだが、SQLServerにデータはあるとして、当然、そこにクエリーを発行してレコードを取得し表示する処理を何かで書いていると思う。この部分は、何を使ってどう処理しているんだろうか。 肝心なのは、その部分になるわけで、そこで「こうやって一覧を出力している」という部分がわかれば、そこを書き換えればいいだけだろう。見たところ、特に2つのテーブルをJOINする必要があるわけではなく、単に取得した1テーブルの表示の仕方の問題のように思える。ならば、レコードを出力する際に、工程数に応じて出力内容を変えるようにするだけですむはずだ。
お礼
回答ありがとうございます。 日中書き込みできなくて遅くなりました。すみません。 VB2008 Expressを使ってます。 ソースにSQL書いてDBに投げてます。 Selectで取得したデータをDataTableに入れてそのままDataGridViewに表示させています。 DataGridViewはSelectで取得した形をそのまま表示できるので、できればSQLでなんとかならないかと考えていました。
お礼
回答ありがとうございます。 これでできました。 書いてるのはVBなので工程のところはForでまわしました。 ありがとうございました。