2017-01-24 13 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_Toが不足している:

  • は、あなたのテーブルのより完全なサンプルを配置することができます。

  • ペンと雇用者の列を欠落した月にどのようにリンクさせるか分かりません。

 


    -- 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 -format)は、ハードコードされた、おそらく不正な 'month'カラムを必要とせず、ローカリゼーションを尊重します。 – 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

関連する問題