2012-04-08 8 views
-2

J'ai une requête qui renvoie un ensemble d'enregistrements comme comme celui ci-dessous: -lignes uniques dans Oracle 11g

Date Dept  commission 

5-Apr Sales  20 
4-Apr Sales  21 
1-Jan Marketing 35 

Cas 1: Si je lance une requête entre le 1 janvier et le 5 avril I devrait obtenir

Date Dept  commission 

5 April Sales  76 

cas n ° 2: et quand je lance la requête entre 1 et 31 jan jan devrait obtenir la sortie comme

Date Dept  commission 

1 Jan Marketing 35 

Cas n ° 2 est simple quand je mets la plage de dates de hte obtenir les résultats nécessaires, mais pas sûr de savoir comment gérer le cas 1 pour afficher le maximum/date, le département pour cette date et une somme de la commission pour ce département, date pour la plage de dates sélectionnée. La sortie sera une ligne unique avec la dernière date et le département avec une somme (commission) pour la plage de dates sélectionnée.

+1

: Si vous exécutez la requête pour le premier cas, vous devriez obtenir 4 avril et le 5 avril, et pour le cas 2, vous devriez obtenir 4 et 5 avril, mais vous obtenez un résultat différent? –

+0

Salut Désolé c'était une faute de frappe de ma part ça devrait être du 1er janvier au 31 janvier –

+0

Et d'où vient ce '71'? @priya: Vous pouvez éditer votre question. –

Répondre

3
SELECT 
    MAX(Date)      AS Date 
    , (SELECT tt.Dept        
     FROM tableX tt 
     WHERE tt.Date = MAX(t.Date) 
    )        AS Dept 
    , SUM(Commission)    AS Commission 
FROM 
    tableX t 
WHERE 
    Date BETWEEN StartDate AND EndDate 

Les travaux ci-dessus dans SQL Server, MySQL, Postgres comme les sql-fiddle, test-1 montre, mais il ne fonctionne pas dans Oracle 11g R2!


Cela fonctionne bien (sql-fiddle, test-2):

SELECT 
    MAX(t.Date)  AS Date 
    , MIN(tt.Dept)  AS Dept    --- MIN, MAX irrelevant 
    , SUM(t.Commission) AS Commission 
FROM 
    (SELECT 
     MAX(Date)      AS Date 
    , SUM(Commission)    AS Commission 
    FROM 
     tableX 
    WHERE 
     Date BETWEEN StartDate AND EndDate 
) t 
    JOIN 
    tableX tt 
     ON tt.Date = t.Date 

Le MIN(tt.Dept) est utilisé pour prendre en charge le cas, vous avez plus de ramer avec la date maximale, disons une ligne avec Sales et une avec Marketing , aussi bien dans Apr-5

Cela fonctionne aussi, en utilisant la fonction analytique LAST_VALUE (sql-fiddle, test-3):

+0

va essayer votre requête et répondre. –

+0

Non, c'est faux. Laissez-moi éditer d'abord. –