2017-05-11 2 views
2

Je souhaite générer un rapport sur les ventes de tout client ayant commandé au cours des deux dernières années.FirebirdSQL Unique et Max (ou MaxValue)

je peux exécuter un rapport de toutes les factures datées dans les deux ans, puis retirez les doublons dans Excel, mais je préférerais le faire directement dans (Firebird) SQL

Je peux utiliser un WHERE date < 1 Jan 2015 (2 ans ou thereabours), mais comment puis-je l'obtenir pour montrer seulement le client une fois? Je pensais que si j'avais utilisé MAX(Date) montrant ainsi la date la plus récente dans cette période de deux ans. Où vais-je mal? Je crois que je dois utiliser une fonction UNIQUE() comme UNIQUE(ORDERCUSTOMER) dans la clause 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 

Je ne l'avoir indiquant la date maximum pour chaque instance de la facture au cours des deux dernières années, mais maintenant ne peut pas bien ce fichier ou le reproduire.

+0

Quelle colonne de «FINANCIALSALESINVOICES» identifie un client particulier? Tu n'as jamais fait clair. –

+0

Donc, vous voulez afficher la dernière facture par client? Est-ce que c'est ce que tu dis? Et avec le client, vous voulez dire le «INVOICECUSTOMER» ou le «ORDERCUSTOMER» ici? –

+0

Le client de la commande. Le but du rapport si pour un envoi postal, qui sera en cours. Si j'ai demandé au client qui a commandé au cours des deux dernières années n'apparaissent qu'une seule fois, alors nous pouvons créer des étiquettes de courrier ou de courrier électronique (ou quel que soit le désir du département de marquage). –

Répondre

1

Une approche consiste à utiliser une sous-requête dans la clause WHERE qui vérifie la facture la plus récente:

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'}' n'est pas quelque chose que Firebird sait lui-même, l'équivalent serait 'date '2015-01-01''. –

1

Avec Firebird 3 vous pouvez utiliser row_number() pour attribuer une valeur unique à chaque ligne dans un groupe (partition), cette valeur peut ensuite être filtrée sur:

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 

Voir aussi Window (Analytical) Functions dans les 3 notes de version Firebird.

+0

Ceci est une bonne alternative en supposant que la version OP de Firebird supporte le numéro de ligne. –

+0

@TimBiegeleisen D'accord, c'est un gros si, mais ils auront toujours votre réponse à retomber. –

+0

Malheureusement Ostendo fonctionne sur Firebird v2.5 (64 bits). Bien, Bon à savoir pour l'avenir. –