質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1906閲覧

DBで集計された部門別・週別のデータ行を部門コードをキーにして週を横に並べる

juriparu0411

総合スコア14

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/11/09 06:10

編集2016/11/15 06:02

###前提・実現したいこと
PHP初心者です。
現在、発注実績を集計するシステムを作成しています。
SELECTボックスから部門(DPT)を選択し、
部門(DPT)、中分類、週別の集計は、できたのですが、
これを、部門(DPT)、中分類、をキーにして、週ごとの発注実績を
横に持たせたいのですが、やり方がどうしてもわかりません。

おわかりの方がいらっしゃいましたら、ご教授お願いいたします。

###発生している問題・エラーメッセージ

エラーメッセージ

PHP

1 2<html> 3 <meta HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=x-sjis"> 4 <head> 5 <title>発注実績</title> 6 </head> 7 <body> 8<?php 9//データベースのインスタンス名を指定 10 11$serverName = ".\\SQLEXPRESS"; 12//接続情報を指定 13$connectionInfo = array("UID"=>"test", 14 "PWD"=>"test", 15 "Database"=>"hattyuujisseki"); 16 17//コネクションを確立 18$conn = sqlsrv_connect($serverName, $connectionInfo); 19//dpt引き渡し 20//クエリー文を指定 21$tsql = "SELECT * from DPTマスタ"; 22//クエリーを実行 23$result = sqlsrv_query($conn, $tsql); 24?> 25 26<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"> 27<select name="dpt" > 28<?php 29 30while ($row = sqlsrv_fetch_array($result)) { 31if ((isset($_POST['dpt']))and($row['DPTコード'] == $_POST['dpt'])) { 32echo ' <option value="' . $row['DPTコード'] . '" selected="selected">' . $row['DPTコード'] . " ".$row['DPT名_漢字'] . '</option>' . "\n"; 33 34$dpt = $_POST['dpt']; 35$dptmei = $row['DPT名_漢字']; 36} else { 37if (isset($_POST['dpt'])) { var_dump($_POST['dpt']); } 38 39echo ' <option value="' . $row['DPTコード'] . '">' . $row['DPTコード'] ." ". $row['DPT名_漢字'] .'</option>' . "\n"; 40} 41} 42?> 43 44</select> 45<input type="submit" name="s" value="検 索" /> 46</form> 47<b>発注実績 &emsp; 48<?php if (isset($_POST['dpt'])){ print("DPT ".$dpt ." ". $dptmei); } ?></b> 49 50<?php 51if (isset($_POST['dpt'])){ 52 53//クエリー文を指定 54 55$tsql = "SELECT DPT,中分類,週, 56 SUM(発数) AS 発注数, 57 SUM(発原額) AS 発注原価, 58 SUM(発売額税抜) AS 発注売価 59 from dbo.VM_納品実績 where DPT = $dpt 60 group by 61 DPT,中分類,週 62 order by DPT,中分類,週"; 63//クエリーを実行 64$result = sqlsrv_query($conn,$tsql); 65}?> 66<table> 67<style> 68 69</style> 70<thead> 71 <tr> 72 <th>中分類</th> 73 <th></th> 74 <th>発注数</th> 75 <th>発注原価</th> 76 <th>発注売価</th> 77 </tr> 78 </thead> 79 80<tbody> 81 82<?php 83 84 //実行結果を描画 85 while($row = sqlsrv_fetch_array($result)) { 86 printf("<tr><th>".$row['中分類']."</th>"); 87 printf("<td >".$row['週']."</td>"); 88 printf("<td >".number_format($row['発注数'])."</td>"); 89 printf("<td >".number_format($row['発注原価'])."</td>"); 90 printf("<td >".number_format($row['発注売価'])."</td></tr>"); 91 } 92?> 93</table> 94<?php 95//クエリー結果の開放 96sqlsrv_free_stmt($result); 97//コネクションのクローズ 98sqlsrv_close($conn); 99?> 100 </body> 101</html> 102

###試したこと
週をDISTINCTして、配列のキーを作成しましたが、その後
どうして良いかわかりませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
IIS 7.0
PHP Version 5.4.45
DATABASE Microsoft SQL Server 2008 R2 Express

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

日付テーブルから、週末日、1週後、・・・を取得し、日付、週番が格納されたカレンダーテーブルから
週番を配列に取得しました。

SQLのSUMは、CASE WHENを使用しています。

PHP

1$tsql = "SELECT 大分類,中分類, 2 SUM(CASE WHEN 週番 <= '$syuban[0]' THEN 発数 ELSE 0 END) AS 発注数1, 3 SUM(CASE WHEN 週番 <= '$syuban[0]' THEN 発原額 ELSE 0 END) AS 発注原価1, 4 SUM(CASE WHEN 週番 <= '$syuban[0]' THEN 発売額税抜 ELSE 0 END) AS 発注売価1, 5 SUM(CASE WHEN 週番 = '$syuban[1]' THEN 発数 ELSE 0 END) AS 発注数2, 6 SUM(CASE WHEN 週番 = '$syuban[1]' THEN 発原額 ELSE 0 END) AS 発注原価2, 7 SUM(CASE WHEN 週番 = '$syuban[1]' THEN 発売額税抜 ELSE 0 END) AS 発注売価2, 8 SUM(CASE WHEN 週番 = '$syuban[2]' THEN 発数 ELSE 0 END) AS 発注数3, 9 SUM(CASE WHEN 週番 = '$syuban[2]' THEN 発原額 ELSE 0 END) AS 発注原価3, 10 SUM(CASE WHEN 週番 = '$syuban[2]' THEN 発売額税抜 ELSE 0 END) AS 発注売価3, 11 SUM(CASE WHEN 週番 = '$syuban[3]' THEN 発数 ELSE 0 END) AS 発注数4, 12 SUM(CASE WHEN 週番 = '$syuban[3]' THEN 発原額 ELSE 0 END) AS 発注原価4, 13 SUM(CASE WHEN 週番 = '$syuban[3]' THEN 発売額税抜 ELSE 0 END) AS 発注売価4, 14 SUM(CASE WHEN 週番 = '$syuban[4]' THEN 発数 ELSE 0 END) AS 発注数5, 15 SUM(CASE WHEN 週番 = '$syuban[4]' THEN 発原額 ELSE 0 END) AS 発注原価5, 16 SUM(CASE WHEN 週番 = '$syuban[4]' THEN 発売額税抜 ELSE 0 END) AS 発注売価5 17 from dbo.VM_納品実績 where 大分類 = $dpt 18 group by 19 大分類,中分類";

投稿2016/11/15 06:14

juriparu0411

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

考え方は3つ

  • RDB側でプロシージャなど利用し、集計されたデータを得る
  • RDBから週データのみ先行して抽出もしくは適当な週を任意にPHPで発生させ

それにあわせたSQL文を作成して再度RDBに問い合わせる

  • RDBからは週ごとに集計したデータを抜き出し、PHP側で整列して置き換える

一番スマートなのは1番ですが、RDBによってできることが違うので
現実的なのは2番、ただし取り扱うデータは集計後のデータなので
3番でやっても良いでしょう。

2でやる場合集計方法は

SQL

1SELECT DPT,中分類, 2SUM(発数*(='◯◯')) AS 発注数◯◯, 3SUM(発原額*(='◯◯')) AS 発注原価◯◯, 4SUM(発売額税抜*(='◯◯')) AS 発注売価◯◯, 5SUM(発数*(='△△')) AS 発注数△△, 6SUM(発原額*(='△△')) AS 発注原価△△, 7SUM(発売額税抜*(='△△')) AS 発注売価△△, 8from VM_納品実績 where DPT = $dpt 9group by 10DPT,中分類 11

のような書き方で横に伸ばしていきます
(発注数、発注原価、発注売価を先行して得た週の数だけループでSQLに追加する)

投稿2016/11/09 06:29

yambejp

総合スコア114505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2016/11/09 06:33

もう一つだけ・・・ ピボットテーブルといって縦に並んだデータを横方向に置き換えるSQLがあります 作業的には効率的ではありませんが考え方は便利なので必要に応じて利用しても よいかもしれません
juriparu0411

2016/11/09 08:14

早速のご回答ありがとうございます。「発数*(週='◯◯')」の 「*」 は掛け算の意味になりますでしょうか?また、動的に週を取得した場合(DISTINCT)、配列に入れてご回答の計算をさせれば 良いでしょうか? 例)SUM(発数*($SYUU[0])) AS 発注数1 尚、SqlserverのPIVOTも検討しましたが、1列しか対応していないようでしたのであきらめていました。
yambejp

2016/11/09 10:01

>「*」 は掛け算の意味になりますでしょうか? そうですね「週='◯◯'」がtrueのときの発数が集計されます。 厳密に書くと SUM(発数*if(週='◯◯',1,0))とかCASE WHENなどで条件を書いてもいいですが おおくのSQLがtrueを1、falseを0と解釈するので提示のSUMが使える場合が多いです
juriparu0411

2016/11/10 00:21

追加の質問にも、早速のご回答ありがとうございます。Sqlserver Mangement Studio のクエリでSUM(発数*(週='◯◯'))  と SUM(発数*if(週='◯◯',1,0)) を試しましたが、両方とも 構文エラーとなってしまいました。今回は、CASE WHENで対応したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問