2011-06-18 5 views
3

je dois requête suivante dans SQL Server:conditionnelle Max dans SQL

SELECT EmployeeID, 
     TotalQuantity AS TotalQty, 
     TotalSales, 
     MAX(CASE WHEN MonthNumber = MAX(MonthNumber) 
      THEN TotalSales END) as RecentMonthSale 
FROM vwSales 
GROUP BY EmployeeID, TotalQuantity , TotalSales 

Bu il me donne l'erreur:

Cannot perform an aggregate function on an expression 
containing an aggregate or a subquery. 

Voir entrée est la suivante:

EmployeeID TotaSales MonthNumber 
    1    4000  1 
    1    6000  2 
    2    8500  1 
    2    6081  2 

Résultat désiré:

EmployeeID TotalSale  RecentMonthSale 
    1   10000   6000 
    2   14581   6081 
    3   11458   1012 

Je veux la colonne suivante dans ma sortie EmployeeID, TotalQuantity TotalSale RecentMonthSale Mon vue a la colonne suivante EmployeeID TotalSale,TotalQuantity, MonthNumber.

+2

Pouvez-vous expliquer ce que vous attendez la requête de montrer? –

+0

Cette mise à jour n'explique pratiquement rien. donnez la définition exacte de la ou des tables, la définition exacte de la vue, et que voulez-vous que la requête renvoie (comme dans 'les ventes totales et les ventes les plus récentes pour chaque employé). –

+0

question mise à jour – Tassadaque

Répondre

2

Cette requête affiche la sortie dont vous avez besoin et ne numérise la table qu'une seule fois.

select EmployeeID, sum(TotalSales), sum(case when MaxMonth = 1 then TotalSales else 0 end) RecentMonthSales 
from 
(
    select *, rank() over(order by MonthNumber desc) MaxMonth 
    from 
    (
     select EmployeeID, MonthNumber, sum(TotalSales) TotalSales 
     from vwSales 
     group by EmployeeID, MonthNumber 
    ) tt 
) tt 
group by EmployeeID 
+0

Juste pour la curiosité. Est-ce que la vue sera exécutée deux fois ou une fois par SQL Server – Tassadaque

+0

@Tassadaque - deux fois. Mais avec un index sur 'MonthNumber' cela n'aura pas d'importance, car il s'agira probablement d'une recherche d'index très rapide. –

+0

votre requête mise à jour ne renvoie qu'un seul employé – Tassadaque

0
SELECT 
    vw.EmployeeID, 
    SUM(vw.TotalSale) as Total, 
    Recent.RecentMonthSale 
FROM 
    vwSales vw 
    LEFT JOIN 
    (
     SELECT 
      _vw.EmployeeID, 
      _vw.TotalSale as RecentMonthSale 
     FROM 
      vwSales _vw 
     INNER JOIN 
     (
      SELECT EmployeeID, MAX(MonthNumber) as MaxMonth 
      FROM vwSales 
      GROUP BY EmployeeID 
     ) _a 
     on _vw.EmployeeID = _a.EmployeeID 
     and _vw.MonthNumber = _a.MaxMonth 
    ) Recent 
    on Recent.EmployeeID = vw.EmployeeID 
GROUP BY 
    vw.EmployeeID, 
    Recent.RecentMonthSale 

Si vous exécutez juste chacun des sous-requêtes et de voir leurs résultats, vous devriez avoir une bonne idée de la façon dont cela fonctionne