- ベストアンサー
テーブル結合時の集計関数について
- Oracleを触り始めて1週間程度の初心者です。以下の3つのテーブルを外部結合し、集計結果を取得するSQL文をご教授いただけないでしょうか。
- COUNT関数やGROUP BY句などを使って事業所1の在籍者の8月分の支払情報を取得します。
- テーブル1とテーブル2を社員名で結合し、テーブル3とも結合して出勤日数、給与、税の情報を集計します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
修正も含みます SELECT tbl1.sya_cd as 社員コード, tbl1.sya_nm as 社員名, SUM(IF(tbl1.status='出勤' OR tbl1.status='遅刻'), 1, 0) as 出勤, SUM(IF(tbl1.status='欠勤'), 1, 0) as 欠勤, SUM(IF(tbl1.status='遅刻'), 1, 0) as 遅刻, SUM(tbl1.hours) as 時間, SUM(tbl1.hours) * tbl2.pay as 給与, (SELECT tax FROM tbl3 WHERE SUM(tbl1.hours) * tbl2.pay BETWEEN tbl3.pay_from AND tbl3.pay_to) as 税 from tbl1 INNER JOIN tbl2 ON tbl2.sya_cd=tbl1.sya_cd WHERE tbl2.jig_cd=1 AND DATE_FORMAT(tbl1.date, '%Y%m')='201208' GROUP BY DATE_FORMAT(tbl1.date, '%Y%m')
その他の回答 (2)
- kosukejlampnet
- ベストアンサー率44% (126/282)
SELECT tbl1.sya_cd as 社員コード, tbl1.sya_nm as 社員名, SUM(IF(tbl1.status='出勤' OR tbl1.status='遅刻'), 1, 0) as 出勤, SUM(IF(tbl1.status='欠勤'), 1, 0) as 欠勤, SUM(IF(tbl1.status='遅刻'), 1, 0) as 遅刻, SUM(tbl1.hours) as 時間, tbl1.hours * tbl2.pay as 給与, from tbl1 INNER JOIN tbl2 ON tbl2.sya_cd=tbl1.sya_cd WHERE tbl2.jig_cd=1 AND DATE_FORMAT(tbl1.date, '%Y%m')='201208' GROUP BY DATE_FORMAT(tbl1.date, '%Y%m') ※tbl3 の関係性が書かれていないのと、推測もつかないので税については省略
- kosukejlampnet
- ベストアンサー率44% (126/282)
結合のSQLより、テーブル設計そのものについてアドバイスを求めたほうが、よろしいかと・・・。 プライマリキーを設定しましょう。 文字列のフィールドを結合キーにするわけにはいきませんから。 このままだと、同姓の人がいたら、大変なことになるよ。
補足
すみません、質問をデフォルメするために「田中」、「佐藤」などの姓で書いていますが、実際には「社員ID」などの主キーが設定されています。今回の場合、「同姓のものは存在しない」という想定のもと、社員名(Sya_Nm)を主キーとして想定していただければと思います。。
お礼
まだ試せてはいないですが、取り急ぎ御礼申し上げます。kosukejlampnetさん、ありがとうございます。 また、tbl3についての説明がなく申し訳ありません。 給与合計がtbl3の「下限」以上、「上限」未満であれば、その行の「税」を課す、という意味です。