У меня есть вид Emp_PRJ_Art в моем SQL Server, как показано ниже.
UsedArticleNo | EmpName | Project | EmpRol
PART0001 | Tintin | PRJ1 | PL
PART0002 | Haddok | PRJ2 | TL
PART0003 | Poppey | PRJ3 | GET
PART0004 | Archie | PRJ4 | PM
PART0005 | Tintin | PRJ1 | PL
PART0006 | Archie | PRJ4 | PM
PART0007 | Tintin | PRJ3 | PL
PART0008 | Haddok | PRJ3 | TL
PART0009 | Poppey | PRJ1 | GET
Я хочу получить такой результат. Числа в столбцах PRJ — это общее количество статей, использованных сотрудником для данного конкретного проекта.
EmpName |PRJ1 | PRJ2 | PRJ3 | PRJ4 | EmpRol
Archie | 0 | 0 | 0 | 2 | PM
Haddok | 0 | 1 | 1 | 0 | TL
Poppey | 1 | 0 | 1 | 0 | GET
Tintin | 2 | 0 | 1 | 0 | PL
Я использовал SQL-запрос вот так и получал результат по мере необходимости.
SELECT *
FROM ( SELECT EmpName, UsedArticleNo, Project
FROM Emp_PRJ_Art)
PIVOT(COUNT(UsedArticleNo) FOR (Project) IN ('PRJ1','PRJ2','PRJ3',’PRJ4’))
ORDER BY EmpName;
Теперь моя проблема в том, что я не могу использовать PHP для запуска этого запроса и, наконец, отображать ту же таблицу, что и веб-страница, как я получаю в консоли разработчика SQL. Ниже код PHP не работает.
<?php
$backcol="bgcolor=#9fffa1"; // Light Green
$colgreen1="bgcolor=#5EE060"; // Light Green
$maxitems=1000; // Maximum items found to display
$s=" <small> ";
$user='odbc';
$pass='abcd';
$sid ='server1.myComp.com';
$adr = "http://server1/WebEditor";
$conn = oci_connect($user, $pass, $sid);
if (!$conn) {
echo "Unable to connect: " . var_dump(OCIError() );
die();
}
}
$cmd="SELECT *
FROM ( SELECT EmpName, Used ArticleNo, Project FROM Emp_PRJ_Art)
PIVOT(COUNT(ArticleNo) FOR (Project) IN ('PRJ1','PRJ2','PRJ3','PRJ4'))
ORDER BY Emp Name";
$stid = oci_parse($conn,$cmd); oci_execute($stid);
echo "<tr>
<th $backcol> $s Employee Name
<th $backcol> $s Project-1
<th $backcol> $s Project-2
<th $backcol> $s Project-3
<th $backcol> $s Project-4
<th $backcol> $s EmpRol
";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
echo "<td> $s " .$row['EmpName']
."<td> $s " .$row['PRJ1']
."<td> $s " .$row['PRJ2']
."<td> $s " .$row['PRJ3']
."<td> $s " .$row['PRJ4']
."<td> $s " .$row['EmpRol']
;
}
echo "</table>\n";
echo "<br><font color='blue'>This is a test</font>";
exit;
?>
EmpName имеет 700 записей, а Project — 70 записей. Используемая статья может быть больше 10к.
В вашем коде множество ошибок, которые мешают его правильной работе. Я изменил его следующим образом и успешно проверил на своих установках (Oracle 11gR2, PHP 5.6.x). Наиболее важным является псевдоним IN
значения, чтобы они не ссылались на окружающие одинарные кавычки '
,
<?php
$backcol = "bgcolor=#9fffa1"; // Light Green
//$colgreen1 = "bgcolor=#5EE060"; // Light Green
//$maxitems = 1000; // Maximum items found to display
$s=" <small> ";
$user = 'odbc';
$pass = 'abcd';
$sid = 'server1.myComp.com';
//$adr = "http://server1/WebEditor";
$conn = oci_connect($user, $pass, $sid);
if (!$conn) {
echo "Unable to connect: " . var_dump(OCIError());
die();
}
//}
$cmd = "SELECT *
FROM ( SELECT EmpName, UsedArticleNo, Project, EmpRol FROM Emp_PRJ_Art)
PIVOT(COUNT(UsedArticleNo) FOR (Project) IN ('PRJ1' as prj1, 'PRJ2' as prj2, 'PRJ3' as prj3, 'PRJ4' as prj4))
ORDER BY EmpName";
$stid = oci_parse($conn,$cmd);
oci_execute($stid);
echo "<table>
<tr>
<th $backcol> $s Employee Name </th>
<th $backcol> $s Project-1 </th>
<th $backcol> $s Project-2 </th>
<th $backcol> $s Project-3 </th>
<th $backcol> $s Project-4 </th>
<th $backcol> $s EmpRol </th>
</tr>";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
echo "<td> $s " . $row['EN'] . "</td>"."<td> $s " . $row['PRJ1'] . "</td>"."<td> $s " . $row['PRJ2'] . "</td>"."<td> $s " . $row['PRJ3'] . "</td>"."<td> $s " . $row['PRJ4'] . "</td>"."<td> $s " . $row['ER'] . "</td>"."</tr>";
}
echo "</table>\n";
Других решений пока нет …