JS click ->
AJAX request
PHP input checker -> PHP check(values) -> PHP input checker return JSON
AJAX parse answer
Form submit ->
PHP form handler -> PHP check(values) -> PHP form handler returns result
SELECT
JSON_OBJECT_AGG
(
year,
JSON_BUILD_ARRAY(jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec)
)
FROM (
SELECT
year,
CASE WHEN jan IS NULL THEN 0 ELSE jan END,
CASE WHEN feb IS NULL THEN 0 ELSE feb END,
CASE WHEN mar IS NULL THEN 0 ELSE mar END,
CASE WHEN apr IS NULL THEN 0 ELSE apr END,
CASE WHEN may IS NULL THEN 0 ELSE may END,
CASE WHEN jun IS NULL THEN 0 ELSE jun END,
CASE WHEN jul IS NULL THEN 0 ELSE jul END,
CASE WHEN aug IS NULL THEN 0 ELSE aug END,
CASE WHEN sep IS NULL THEN 0 ELSE sep END,
CASE WHEN oct IS NULL THEN 0 ELSE oct END,
CASE WHEN nov IS NULL THEN 0 ELSE nov END,
CASE WHEN dec IS NULL THEN 0 ELSE dec END
FROM CROSSTAB
(
'SELECT
EXTRACT(YEAR FROM order_date) AS year,
EXTRACT(MONTH FROM order_date) AS month,
COUNT(order_id) AS qty
FROM
orders
WHERE
order_date > order_date - interval ''4 year'' AND
order_state = '?'
GROUP BY
year,
month
ORDER BY
year DESC',
'SELECT m FROM generate_series(1,12) m'
) AS (
year INT,
jan INT,
feb INT,
mar INT,
apr INT,
may INT,
jun INT,
jul INT,
aug INT,
sep INT,
oct INT,
nov INT,
dec INT
) ORDER BY year DESC
LIMIT 3
) data
{ "2017" : [214, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "2016" : [119, 181, 194, 200, 170, 211, 179, 199, 233, 225, 205, 154], "2015" : [124, 130, 152, 187, 159, 164, 129, 116, 115, 119, 129, 106] }
Начнем с того, что вы предоставили простейший запрос в первом комментарии.а зачем пугать людей странными и тяжелыми запросам, которые могут ввести в заблуждение людей... ведь вас же ввел
Теперь вы показали запрос, который при 100 итераций повесит БД. Что уже не верно.этот запрос на самом деле просто переворачивает результат выборки из вертикальной таблицы в горизонтальную для формирования графика. Ничего сложного и необычного. Просто пользователи не знают всех возможностей БД и не использует заложенный инструментарий. Этот как с MS Word, когда люди выписывают номера страниц вручную, когда есть колонтитулы.
Но и в ORM данная конструкция реализуется спокойно (в смысле без костылей). Но лучше сделать с expand интегрировав объекты под каждый тип, так быстрее будет обрабатываться.мне кажется вы ошибаетесь. Зачем забирать процессорное время, создавать временные массивы, перебирать их, нагружать память лишним препроцессорным кодом, когда это может сделать БД за более короткий срок и с меньшей тратой ресурсов? У меня все руки не доходят сразу выводить в JSON строке эти записи, чтобы не нагружать препроцессор логикой и лишним кодом, так как эта выборка нужна именно в строчном варианте.
Такое ощущение, что вы показали какой то сложный запрос и пытаетесь этим гордиться.это один из самых обычных запросов в моей повседневной практике. Я пытаюсь заставить БД работать на все 100% что она умеет. Умеет работать с JSON и делать выборку в нем? Круто. Менять значение в отдельных полях XML записи? Круто! Нафига выгружать данные из базы, менять их и снова апдейтить, когда сделать можно инструментами самой базы?
SELECT
year,
CASE WHEN jan IS NULL THEN 0 ELSE jan END,
CASE WHEN feb IS NULL THEN 0 ELSE feb END,
CASE WHEN mar IS NULL THEN 0 ELSE mar END,
CASE WHEN apr IS NULL THEN 0 ELSE apr END,
CASE WHEN may IS NULL THEN 0 ELSE may END,
CASE WHEN jun IS NULL THEN 0 ELSE jun END,
CASE WHEN jul IS NULL THEN 0 ELSE jul END,
CASE WHEN aug IS NULL THEN 0 ELSE aug END,
CASE WHEN sep IS NULL THEN 0 ELSE sep END,
CASE WHEN oct IS NULL THEN 0 ELSE oct END,
CASE WHEN nov IS NULL THEN 0 ELSE nov END,
CASE WHEN dec IS NULL THEN 0 ELSE dec END
FROM CROSSTAB
(
'SELECT
EXTRACT(YEAR FROM invoice_date) AS year,
EXTRACT(MONTH FROM invoice_date) AS month,
SUM(invoice_amount) / 1000 AS qty
FROM
invoices
WHERE
invoice_date > invoice_date - interval ''4 year''
GROUP BY
year,
month
ORDER BY
year DESC',
'SELECT m FROM generate_series(1,12) m'
) AS (
year INT,
jan NUMERIC,
feb NUMERIC,
mar NUMERIC,
apr NUMERIC,
may NUMERIC,
jun NUMERIC,
jul NUMERIC,
aug NUMERIC,
sep NUMERIC,
oct NUMERIC,
nov NUMERIC,
dec NUMERIC
) ORDER BY year DESC
LIMIT 3