2017-05-11 7 views
2

過去2年間に発注した顧客の売上からレポートを実行したいとします。FirebirdSQL Unique&Max(またはMaxValue)

私はWHERE date < 1 Jan 2015(2年またはthereabours)を使用することができます私は、Excelで重複を削除2年以内に日付すべての請求書のレポートを実行することができますが、私はむしろ(火の鳥)SQL内で直接

それを行うだろう、一度しか顧客を表示しないようにするにはどうすればよいですか?私はMAX(Date)を使用して、その2年間で最新の日付を表示すると思った。どこが間違っていますか?私はUNIQUE(ORDERCUSTOMER)のようなUNIQUE()の機能をSELECT句の中で使う必要があると思います。

SELECT 
FINANCIALSALESINVOICES.TRANSACTIONDATE, 
FINANCIALSALESINVOICES.INVOICECUSTOMER, 
FINANCIALSALESINVOICES.ORDERCUSTOMER, 
FINANCIALSALESINVOICES.INVOICENUMBER, 
FINANCIALSALESINVOICES.SOURCENUMBER, 
MAX(FINANCIALSALESINVOICES.TRANSACTIONDATE) 

FROM FINANCIALSALESINVOICES 
WHERE (FINANCIALSALESINVOICES.TRANSACTIONDATE>={d '2015-01-01'}) 
ORDER BY FINANCIALSALESINVOICES.INVOICECUSTOMER, FINANCIALSALESINVOICES.TRANSACTIONDATE 

私はそれは、過去2年間で、請求書の各インスタンスの最大の日付を示したでしたが、今、そのファイルを微またはそれを複製することはできません。

+0

'FINANCIALSALESINVOICES'の特定の顧客を特定する列はどれですか?あなたはこれを明確にしたことはありません。 –

+0

お客様ごとに最新の請求書を表示したいですか?これはあなたが言っていることですか?顧客とは、ここで 'INVOICECUSTOMER'または' ORDERCUSTOMER'を意味しますか? –

+0

注文者。 郵送の場合のレポートの目的は、進行中です。私が過去2年間に注文した顧客を1度しか見せなかった場合は、メールラベルまたは電子メール(またはマーキング部門が望むもの)を作成することができます。 –

答えて

1

一つのアプローチ最新の請求書をチェックWHERE句でサブクエリを使用することです:

SELECT 
    t.TRANSACTIONDATE, 
    t.INVOICECUSTOMER, 
    t.ORDERCUSTOMER, 
    t.INVOICENUMBER, 
    t.SOURCENUMBER 
FROM FINANCIALSALESINVOICES t 
WHERE t.TRANSACTIONDATE >= date '2015-01-01' AND 
     t.TRANSACTIONDATE = (SELECT MAX(f.TRANSACTIONDATE) 
          FROM FINANCIALSALESINVOICES f 
          WHERE t.ORDERCUSTOMER = f.ORDERCUSTOMER AND 
           f.TRANSACTIONDATE >= {d '2015-01-01'}) 
ORDER BY t.INVOICECUSTOMER, 
     t.TRANSACTIONDATE 
+0

'{d '2015-01-01'}'はFirebird自身が知っているものではないので、同等のものは 'date '2015-01-01' 'でしょう。 –

1

Firebirdの3を使用すると、グループ内の各列に一意の値を割り当てるためにrow_number()を使用することができます(パーティション)、その値は、その後にフィルタリングすることができます。

select 
    a.TRANSACTIONDATE, 
    a.INVOICECUSTOMER, 
    a.ORDERCUSTOMER, 
    a.INVOICENUMBER, 
    a.SOURCENUMBER 
from (
    select 
     TRANSACTIONDATE, 
     INVOICECUSTOMER, 
     ORDERCUSTOMER, 
     INVOICENUMBER, 
     SOURCENUMBER, 
     row_number() over (partition by INVOICECUSTOMER, order by TRANSACTIONDATE desc) as rownr 
    from FINANCIALSALESINVOICES 
    where TRANSACTIONDATE >= date '2015-01-01' 
) a 
where a.rownr = 1 
order by a.INVOICECUSTOMER, a.TRANSACTIONDATE 

はFirebirdの3リリースノートにもWindow (Analytical) Functionsを参照してください。

+0

これは、OPのバージョンのFirebirdが行番号をサポートしていると仮定すると、いい選択肢です。 –

+0

@TimBiegeleisen合意した、それは大きなifですが、彼らはいつもあなたの答えを返すでしょう。 –

+0

残念ながら、OstendoはFirebird v2.5(64ビット)で動作します。しかし、未来を知っておくと良い。 –