2015-07-01 2 views
0

У меня есть хранимая процедура, где я запрашиваю данные за некоторый промежуток времени. Так что я написал ниже запрос будет выполняться в хранимой процедуре:Получить значение по умолчанию, если нет данных для запроса?

SET @quer = CONCAT('INSERT INTO tmp (`time_interval`, `cnt`, `dat`, `txn_id`) (SELECT DATE_FORMAT(\'', tmpStart, '\', \'%H:%i\') as time_interval , COUNT(v.id) as cnt 
    , date(v.timestamp) as dat, \"', _txn_id, '\" as txn_id FROM vehicle v WHERE v.timestamp BETWEEN \'', tmpStart, '\' 
         AND \'', tmpEnd, '\' ', _where_clause, ' GROUP BY time_interval)') 

Но проблема, я хочу, чтобы вставить 0 в течение интервала времени, для которого не существует никакого значения.

Actual : for 01:00 - 02:00 = 12 
     for 03:00 - 04:00 = 10 
Expected:for 01:00 - 02:00 = 12 
     for 02:00 - 03:00 = 0 
     for 03:00 - 04:00 = 10 

Возможно, кто-нибудь может предложить, как я могу изменить запрос, чтобы получить этот результат.

Спасибо.

ответ

0

Попробуйте использовать функцию срастаться, если столбец имеет нулевое значение, то сливаться функция поставить значение по умолчанию, пример ниже:

SELECT id, ..., coalesce(columnWithNulls, DefaultValue) FROM ... 
+0

Я отредактировал вот так: COALESCE (COUNT (v.id), 0) как cnt, но он все тот же. Я делаю это неправильно? – GuruKulki

+0

Это странно. Coalesce должен работать, как шарм. Какой результат возвращает ваш запрос? Мне особенно интересно о столбце cnt. Вы также можете попробовать синтаксис case. 'select (case COUNT (v.id) null [ИЛИ WHATEVER INVALID COUNT WER RETURN] THEN 0 ELSE COUNT (v.id) END) as cnt ...' – Dapter20

0

попробуйте использовать функцию IFNULL

SELECT IFNULL(DATE_FORMAT(\'', tmpStart, '\', \'%H:%i\'),'0') as time_interval

+0

Нет, это не работает. Я хочу иметь cnt как 0, для него нет значения. – GuruKulki

+0

Вместо того, чтобы вставлять из списка результатов запроса select, вы можете вставить все time_intervals и дату сразу в таблицу tmp. И позже вы можете использовать запрос обновления с помощью IFNULL (colwithnull, 'default value'). Для например 'вставить в TMP (' time_interval', 'dat') значения ('01: 00 - 02:00' , '2015-07-01')' А позже 'обновление TMP набора 'time_interval' = (SELECT IFNULL (DATE_FORMAT (\ '', tmpStart, '\', \ '% H:% i \'), '0')))' – Manii

0

Я получил мой ответьте на этот запрос. Union ALL со значением по умолчанию 0.

SET @quer = CONCAT('INSERT INTO tmp (`time_interval`, `cnt`, `dat`, `txn_id`) Select * FROM (SELECT DATE_FORMAT(\'', tmpStart, '\', \'%H:%i\') as time_interval , COUNT(v.id) as cnt 
, date(v.timestamp) as dat, \"', _txn_id, '\" as txn_id FROM vehicle v WHERE v.timestamp BETWEEN \'', tmpStart, '\' 
        AND \'', tmpEnd, '\' ', _where_clause, ' GROUP BY time_interval UNION ALL SELECT DATE_FORMAT(\'', tmpStart, '\', \'%H:%i\') as time_interval , 0 as cnt 
, date(\'', tmpStart, '\') as dat, \"', _txn_id, '\" as txn_id) AS A GROUP BY A.time_interval'); 
Смежные вопросы