Получение отчетов из базы данных Oracle

Я работаю над сценарием php, который генерирует отчет из базы данных оракула. Я хочу улучшить качество результатов, которые я получаю. Я хочу, чтобы в таблице были итоги внизу.
Это то, что я получаю. Я хочу, чтобы децили были в порядке сборки или убывания, потому что я отказался сделать это с помощью sql (есть дециль 10, которой я не могу управлять).
Я также хочу иметь итоги двух столбцов (total_decile_count и FULL_KYC) там внизу.

ECILE   TOTAL_DECILE_COUNT  FULL_KYC    PERCENTAGE
Decile 9    5091             1936           38.03
Decile 8    12472           5580            44.74
Decile 7    29927           14838           49.58
Decile 6    36481           18770           51.45
Decile 5    33460           18356           54.86
Decile 4    30454           17010           55.85
Decile 3    24243           14175           58.47
Decile 2    16912           8245            48.75
Decile 10   4231            2122            50.15
Decile 1    8801            4835            54.94
Bal.barred  1188354        115601           9.73

Это мой код Не против sql, потому что там нет проблем. Меня интересует код php.

<?php
ini_set('max_execution_time', 0);
ini_set('memory_limit', '1500M');
$c = oci_pconnect("xxx", "xxx", "xxxx");
if (!$c) {
$e = oci_error();
trigger_error('Could not connect to database: '. $e['message'],E_USER_ERROR);
}
$s = oci_parse($c, "WITH
dcl AS (
select count(n.msisdn) FULL_KYC,case when n.decile_group is NULL then 'Bal.barred' else n.decile_group end decile_group
from (select distinct (a.msisdn)msisdn,b.segment,b.decile_group
from table1 a full join table2 b on a.msisdn=b.msisdn)n,
(select distinct msisdn from (
select case
when substr(msisdn,1,1) = '7' then ''||msisdn
when substr(msisdn,1,1) = '0' then ''||substr(msisdn,2,9)
else msisdn end msisdn from table3))p
where n.msisdn=p.msisdn
group by n.decile_group),

base as (select decile,total_decile_count from table4 )

select base.decile, base.total_decile_count,dcl.full_kyc,round(((dcl.full_kyc/base.total_decile_count)*100),2) Percentage
from dcl left join base on base.decile=dcl.decile_group order by base.decile desc");if (!$s) {
$e = oci_error($c);
trigger_error('Could not parse statement: '. $e['message'], E_USER_ERROR);
}
$r = oci_execute($s);
if (!$r) {
$e = oci_error($s);
trigger_error('Could not execute statement: '. $e['message'], E_USER_ERROR);
}
echo "<table border='1'>\n";
$ncols = oci_num_fields($s);
echo "<tr>\n";
for ($i = 1; $i <= $ncols; ++$i) {
$colname = oci_field_name($s, $i);
echo " <th><b>".htmlentities($colname, ENT_QUOTES)."</b></th>\n";
}
echo "</tr>\n";
while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>".($item!==null?htmlentities($item,
ENT_QUOTES):"&nbsp;")."</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
?>

1

Решение

Предполагая, что вашей основной проблемой является правильный порядок, вы можете добиться этого легко в SQL, как показано ниже (только order by часть важна, остальное для презентации)

with test_data as (
select 'Decile 1' decile, 7 total_decile_count, 4 full_kyc, 38.00 Percentage from dual
union select 'Decile 2', 12, 5, 45.00 from dual
union select 'Decile 3', 11, 19, 42.00 from dual
union select 'Decile 11', 11, 8, 8.87 from dual
)
select *
from (
select decile, total_decile_count, full_kyc, percentage from test_data
union
select 'Sums' decile, sum(total_decile_count) total_decile_count,
sum(full_kyc) full_kyc, sum(percentage) percentage from test_data)
order by case when decile like 'Decile%' then 1 else 2 end,
length(trim(decile)) desc, decile desc

Выход:

DECILE       TOTAL_DECILE_COUNT    FULL_KYC    PERCENTAGE
Decile 11                    11           8          8,87
Decile 3                     11          19         42,00
Decile 2                     12           5         45,00
Decile 1                      7           4         38,00
Sums                         41          36        133,87
0

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

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

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