2017-01-24 5 views
0

Это мой view_remit. Мне нужно определить месяцы, отсутствующие в столбце month_paid.Как найти отсутствующий месяц в столбце в mysql?

enter image description here

Я использовал этот код, чтобы получить эту таблицу, но я не знаю, как определить недостающие месяцы.

SELECT RemitNo, PEN, Employer, month_paid, Total_PBR_Amt 
FROM view_remit 
JOIN ( 
     SELECT 'JAN' as month_paid,'2016-01-01' as start,'2016-01-31' as end UNION ALL 
     SELECT 'FEB' as month_paid,'2016-02-01' as start,'2016-02-29' as end UNION ALL 
     SELECT 'MAR' as month_paid,'2016-03-01' as start,'2016-03-31' as end UNION ALL 
     SELECT 'APR' as month_paid,'2016-04-01' as start,'2016-04-30' as end UNION ALL 
     SELECT 'MAY' as month_paid,'2016-05-01' as start,'2016-05-31' as end UNION ALL 
    SELECT 'JUN' as month_paid,'2016-06-01' as start,'2016-06-30' as end UNION ALL 
    SELECT 'JUL' as month_paid,'2016-07-01' as start,'2016-07-31' as end UNION ALL 
    SELECT 'AUG' as month_paid,'2016-08-01' as start,'2016-08-31' as end UNION ALL 
     SELECT 'SEP' as month_paid,'2016-09-01' as start,'2016-09-30' as end UNION ALL 
     SELECT 'OCT' as month_paid,'2016-10-01' as start,'2016-10-31' as end UNION ALL 
     SELECT 'NOV' as month_paid,'2016-11-01' as start,'2016-11-30' as end UNION ALL 
     SELECT 'DEC' as month_paid,'2016-12-01' as start,'2016-12-31' as end 
    ) M 
    ON view_remit.AP_From <= M.end 
    AND view_remit.AP_To >= M.start 
ORDER BY PEN, AP_From 

Мне нужно получить этот выход.

|PEN|Employer|month| 
| 1 | a | MAR | 
| 1 | a | JUN | 
| 1 | a | JUL | 
| 1 | a | SEP | 
| 1 | a | OCT | 
| 1 | a | NOV | 

Любая помощь с благодарностью. Спасибо заранее.

+1

проверить эту ссылку, может быть, вы получите представление http://stackoverflow.com/questions/27600863/mysql-monthly-sale-of-last-12-months-including-months-with-no-sale –

+0

Такие проблемы, как правило, лучше всего обрабатываются в коде уровня приложения. – Strawberry

ответ

1

Я все еще не могу комментировать из-за моего уровня репутации. Я исправлю этот ответ, как только вы дать ответ на мои вопросы:

  • Вы можете разместить более полный образец вашей таблицы: колонка AP_From и AP_ отсутствуют.

  • Я не понимаю, как вы связываете столбцы Ручка и работодатель с отсутствующими месяцами. Во всяком случае, чтобы получить недостающий месяц основанный на те, которые доступны на вашем столе, я бы действовать следующим образом:

 


    -- Just for sample query purpose 
    IF OBJECT_ID('tempdb..#view_remit') is not null 

    DROP TABLE #view_remit 
    CREATE TABLE #view_remit (
     RemitNo    INT, 
     PEN     INT, 
     Employer   VARCHAR(10), 
     wmonth    VARCHAR(3), 
     Total_PBR_Amt  FLOAT, 
     AP_Date    DATE 
    ) 

    INSERT INTO #view_remit VALUES 
    (1,1,'a','JAN',200, '2016-01-20'), 
    (1,1,'a','FEV',200, '2016-02-12'), 
    (1,1,'a','APR',200, '2016-04-25'), 
    (1,1,'a','AUG',200, '2016-08-02'), 
    (1,1,'a','DEC',200, '2016-12-24') 

    -- Your working month table 
    IF OBJECT_ID('tempdb..#table_month') is not null 
     DROP TABLE #table_month 
    CREATE TABLE #table_month (
     wmonth    VARCHAR(3), 
     DateBegin   DATE, 
     EndBegin   DATE 
    ) 
    INSERT INTO #table_month VALUES 
    ('JAN', '2016-01-01', '2016-01-31'), 
    ('FEV', '2016-02-01', '2016-02-29'), 
    ('MAR', '2016-03-01', '2016-03-31'), 
    ('APR', '2016-04-01', '2016-04-30'), 
    ('MAI', '2016-05-01', '2016-05-31'), 
    ('JUN', '2016-06-01', '2016-06-30'), 
    ('JUL', '2016-07-01', '2016-07-31'), 
    ('AUG', '2016-08-01', '2016-08-31'), 
    ('SET', '2016-09-01', '2016-09-30'), 
    ('OCT', '2016-10-01', '2016-10-31'), 
    ('NOV', '2016-11-01', '2016-11-30'), 
    ('DEC', '2016-12-01', '2016-12-31') 


    SELECT PEN, Employer, tm.wmonth 
    FROM #table_month tm 
    LEFT JOIN #view_remit vr 
    ON vr.wmonth = tm.wmonth 
    WHERE vr.wmonth is null 

 
+0

Я сожалею, что не предоставил достаточно данных. – Clorae

+0

Я предполагаю, что это португальские аббревиатуры, но OP находятся на английском языке. Стоит отметить, что ['upper (date_format (start, '% b'))'] (https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date -формат) избегает необходимости иметь стробированную и, возможно, неправильную колонку «месяц» и будет выполнять локализацию. – Schwern

0

Обычно вы бы использовать EXCEPT set operator для этого. Настройте таблицу под названием months со всеми месяцами в ней, затем выберите все эти месяцы , кроме те, что указаны в view_remit.

select month from months 
except 
select distinct month from view_remit 

Но MySQL не поддерживает EXCEPT. Вместо этого используйте left outer join, чтобы получить месяцы, отсутствующие в view_remit.

select distinct months.month 
from months 
left join view_remit vr on months.month = vr.month 
where vr.month is null; 
+0

это потому, что есть много «PEN», мне нужно получить месяцы, которые нетитулы, которые он видит для каждого «PEN», когда я использовал группу, ничего не произошло – Clorae

+0

@Clorae Извините, я не уверен, что все это значит. – Schwern

+0

Что мне нужно, так это то, что мне нужно получить месяцы, которые не отображаются в расчете на 'PEN'. в моем примере. – Clorae