У меня есть вопрос относительно получения данных о производстве за два дня назад. мой код работает, но я считаю его неэффективным с моей реализацией. Что у меня есть это,
// YESTERDAYS FABRICATION
$yesterdaySql = "SELECT SUM(CURRENT_WEIGHT) AS TOTALYESTERDAYWEIGHT FROM FABRICATION_HIST
WHERE TO_CHAR (FAB_ENTRY_DATE,'MM/DD/YYYY') = TO_CHAR(SYSDATE - 1, 'MM/DD/YYYY')
AND PROJECT_NAME = :projName";
$yesterdayParse = oci_parse($conn, $yesterdaySql);
oci_bind_by_name($yesterdayParse, ":projName", $_SESSION['cd-dropdown']);
oci_define_by_name($yesterdayParse, "TOTALYESTERDAYWEIGHT", $sumWeightYesterday);
oci_execute($yesterdayParse);
// TWO DAYS AGO FABRICATION
$twoDaysSql = "SELECT SUM(CURRENT_WEIGHT) AS TOTALTWODAYSAGOWEIGHT FROM FABRICATION_HIST
WHERE TO_CHAR (FAB_ENTRY_DATE,'MM/DD/YYYY') = TO_CHAR(SYSDATE - 2, 'MM/DD/YYYY')
AND PROJECT_NAME = :projName";
$twoDaysParse = oci_parse($conn, $twoDaysSql);
oci_bind_by_name($twoDaysParse, ":projName", $_SESSION['cd-dropdown']);
oci_define_by_name($twoDaysParse, "TOTALTWODAYSAGOWEIGHT", $sumWeightTwoDays);
oci_execute($twoDaysParse);
Я знаю, что это очень неэффективно. Кто-нибудь может предложить мне, чтобы я мог получить двухдневный запрос в одном запросе?
заранее спасибо
Вот ты где …
SELECT
SUM(CASE WHEN TRUNC(FAB_ENTRY_DATE) = TRUNC(SYSDATE) - 1 THEN CURRENT_WEIGHT END) AS TOTALYESTERDAYWEIGHT,
SUM(CASE WHEN TRUNC(FAB_ENTRY_DATE) = TRUNC(SYSDATE) - 2 THEN CURRENT_WEIGHT END) AS TOTALTWODAYSAGOWEIGHT
FROM FABRICATION_HIST
WHERE FAB_ENTRY_DATE >= TRUNC(SYSDATE) - 2
AND FAB_ENTRY_DATE < TRUNC(SYSDATE)
AND PROJECT_NAME = :projName
;
… и это даже хорошо индексируется:
create index i_fabrication_hist_something
on t_fabrication_hist (project_name, fab_entry_date)
compress 1
compute statistics
;
Других решений пока нет …