Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Проблема с запросом SQL (https://javascript.ru/forum/server/82143-problema-s-zaprosom-sql.html)

shareware 20.03.2021 15:06

Проблема с запросом SQL
 
Сижу вторые сутки и дико туплю. Господа, подскажите, как получить то, чего желаю..


Выбираю период (в одном и том же году). Например, с 1 января до 31 декабря 2013 года. Далее делаю SUM() для нужного столбца. Код:

// Идентификатор объекта в городе
foreach (json_decode($this->data['need_radio']) as $k=>$v)
{
$tempDataArray = []; $tempSumArray = [];
 
$query = pg_query($this->connection,"
    SELECT town_name FROM sprtowns WHERE town_id=".$v."
") or die($this->sendMessage(true,'Ошибка запроса. m:one:sprt_mult'));
 
$tmp = pg_fetch_array($query);
 
 
$queryPayment = pg_query($this->connection, "
  SELECT to_char(pay.date_pay::abstime::timestamp, 'mm-yyyy') as date, sum(pay.summ) as summ FROM payment as pay, orders as 
  ord WHERE pay.date_pay>=".$from_date." AND pay.date_pay<=".$to_date."
  AND pay.dropped=0 AND pay.plan_pay=0 AND pay.order_id=ord.order_id AND ord.dogovor_town_id=".$v." AND 
  ord.is_test_object=0 AND ord.type=1 AND ord.dropped=0 AND ord.org_id=1
  GROUP BY date         
") or die($this->sendMessage(true,'Ошибка запроса. m:one:qrypmnt_mult'));
 
}


Пример получаемых данных для г.Комсомольска-на-Амуре:
Код:

date    summ
01-2013        16074
02-2013        295640.399609375
03-2013        633340.14
04-2013        1503321.66058594
05-2013        1027556.70068359
06-2013        744836.5
07-2013        1321706.7
08-2013        26606
08-2013        596959.54
09-2013        1050410.6
10-2013        1063984.06995117
11-2013        1102416.03
12-2013        61767
12-2013        2558022.37

А вот пример для г.Благовещенск:
Код:

date    summ
09-2013        32275
12-2013        38275

Я хочу, чтобы для Благовещенска и других городов выдавался тот интервал, который я выбрал. Если для данной даты нет значения, то хочу получить такой вид:

Код:

date    summ
01-2013        NULL
02-2013        NULL
03-2013        NULL
04-2013        NULL
05-2013        NULL
06-2013        NULL
07-2013        NULL
08-2013        NULL
09-2013        32275
10-2013        NULL
11-2013        NULL
12-2013        NULL
12-2013        38275

Подскажите, пожалуйста, как поступить..я вроде знаю про LEFT JOIN, который в теории мог бы мне помочь, но как его применить - в мыслях нету :(

ksa 20.03.2021 16:54

shareware, у тебя должна существовать таблица с записями "date", которые тебе нужны.
Либо придется "соединять" таблицы из одной записи
SELECT name FROM users 
UNION 
SELECT name FROM orders

в которой первый столбец-скаляр с нужным месяцем... А второй это результат запроса к другой таблице.
Сколько нужно месяцев - столько и "соединений".

shareware 20.03.2021 17:10

Цитата:

Сообщение от ksa (Сообщение 534791)
shareware, у тебя должна существовать таблица с записями "date", которые тебе нужны.
Либо придется "соединять" таблицы из одной записи
SELECT name FROM users 
UNION 
SELECT name FROM orders

в которой первый столбец-скаляр с нужным месяцем... А второй это результат запроса к другой таблице.
Сколько нужно месяцев - столько и "соединений".

Это получается 12 UNION'ов плодить для каждого месяца ?
А циклом через PHP можно такое провернуть ? Например, я сейчас костылить пытаюсь в таком формате:

$old = 0;
while ($res = pg_fetch_array($queryPayment))
{
							
$tempDataArray[] = $res['date'];
$tempSumArray[] = round($res['summ'],2);
													
}

$new = count($tempDataArray); // Сколько дат в массиве



if ($old < $new){
$old = $new;
}else{
$expl = explode('-',$tempDataArray[0]); // Берем номер месяца
$i = 0;
for ($i = 0; $i<=$old; $i++)
{
for ($j=$countSumArray; $j<=$old; $j++)
{
if ($i == (int)$expl[0]) {
											 $tempSumArray[$j] = $oldSum[$i];
}else{
											$tempSumArray[$j] = null;
}
										
}
									
									
									
}


}


И оно вроде бы как работает..только наоборот, NULL добавляется не в нужные места, а после всех данных..не соображаю уже, а тут явная ошибка из за моей невнимательности, может вы увидите

ksa 20.03.2021 17:21

Цитата:

Сообщение от shareware
Это получается 12 UNION'ов плодить для каждого месяца ?

Года, не месяца...
Можно просто завести такую таблицу-словарь. Тогда "главный" запрос делается к ней, год указывается как скаляр.
А сумма - уже результат запроса к другой таблице с нужными параметрами.

Цитата:

Сообщение от shareware
А циклом через PHP можно такое провернуть ?

Если, помимо запросов, у тебя есть целый ЯП - можно делать все, что угодно!!! :D

ksa 20.03.2021 17:22

Цитата:

Сообщение от shareware
может вы увидите

Я на ПХП не пишу...

У меня свои ЯП в работе. Но с данными работаю давно и проблем с их обработкой не имею.

Vlasenko Fedor 21.03.2021 21:49

Код:

sum(case when (`...` = '10') then `fields` end
SUM(IF(`aaa`='value', `000`, 0))

и т.д в зависимости от бд


Часовой пояс GMT +3, время: 10:46.