Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.03.2021, 15:06
Аспирант
Отправить личное сообщение для shareware Посмотреть профиль Найти все сообщения от shareware
 
Регистрация: 04.11.2019
Сообщений: 32

Проблема с запросом 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, который в теории мог бы мне помочь, но как его применить - в мыслях нету
Ответить с цитированием
  #2 (permalink)  
Старый 20.03.2021, 16:54
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

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

в которой первый столбец-скаляр с нужным месяцем... А второй это результат запроса к другой таблице.
Сколько нужно месяцев - столько и "соединений".
Ответить с цитированием
  #3 (permalink)  
Старый 20.03.2021, 17:10
Аспирант
Отправить личное сообщение для shareware Посмотреть профиль Найти все сообщения от shareware
 
Регистрация: 04.11.2019
Сообщений: 32

Сообщение от ksa Посмотреть сообщение
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 добавляется не в нужные места, а после всех данных..не соображаю уже, а тут явная ошибка из за моей невнимательности, может вы увидите
Ответить с цитированием
  #4 (permalink)  
Старый 20.03.2021, 17:21
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от shareware
Это получается 12 UNION'ов плодить для каждого месяца ?
Года, не месяца...
Можно просто завести такую таблицу-словарь. Тогда "главный" запрос делается к ней, год указывается как скаляр.
А сумма - уже результат запроса к другой таблице с нужными параметрами.

Сообщение от shareware
А циклом через PHP можно такое провернуть ?
Если, помимо запросов, у тебя есть целый ЯП - можно делать все, что угодно!!!
Ответить с цитированием
  #5 (permalink)  
Старый 20.03.2021, 17:22
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от shareware
может вы увидите
Я на ПХП не пишу...

У меня свои ЯП в работе. Но с данными работаю давно и проблем с их обработкой не имею.
Ответить с цитированием
  #6 (permalink)  
Старый 21.03.2021, 21:49
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Код:
sum(case when (`...` = '10') then `fields` end
SUM(IF(`aaa`='value', `000`, 0))
и т.д в зависимости от бд
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с кроссдоменным запросом Batska AJAX и COMET 3 13.08.2014 00:38
проблема с get запросом FearOfTheHamster AJAX и COMET 4 19.02.2014 15:10
Проблема с радио кнопками px379 Общие вопросы Javascript 8 29.07.2013 09:30
Проблема с яакс запросом rudolfe Internet Explorer 5 25.02.2013 19:36
проблема с mysql запросом bushstas Серверные языки и технологии 0 29.01.2013 20:34