PHP скрипт для PIVOT в SQL

У меня есть вид 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к.

1

Решение

В вашем коде множество ошибок, которые мешают его правильной работе. Я изменил его следующим образом и успешно проверил на своих установках (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";
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]