2017-03-28 3 views
0

J'ai un tableau qui enregistre les ventes et je veux un rapport sur combien d'impôt a été payé sur chaque élément. La règle de base est que toutes les ventes avant le 1er avril ont une taxe de 0,52%, toutes les ventes après cette date auront une taxe de 0,5%.SQL Server: appliquer différents multiplicateurs par date

J'essaie d'obtenir cela en utilisant la requête suivante

select ItemCode, 
    sum(Quantity) QuantitySold, 
    WhsCode as Store, 
    case when (docdate < '20170401') then sum(Quantity * .0052) else sum(Quantity * .005) end as Tax 
from SalesTable 
group by whscode, 
    itemcode 

Cependant je reçois un

datedoc » est invalide dans la liste de sélection, car il ne figure pas dans soit un agrégat fonction ou la clause GROUP BY.

erreur si je l'exécute tel quel. L'ajout de DocDate à la clause group by crée un désordre de doublons (dans un exemple, je suis passé de 185 lignes à 1508 lignes).

SQL ne vous permet tout simplement pas d'utiliser les instructions WHEN dont le conditionnel n'est pas inclus dans la clause Group ou devrais-je utiliser autre chose?

+0

Il est bizarre que vous appliquez la taxe à la 'quantity' au lieu d'un total des ventes de' quantité * price'. Je ne dis pas que c'est faux, il semble juste étrange de le voir écrit de cette façon. – SqlZim

+0

Oups, vous avez raison, je l'ai mélangé avec une taxe différente par article plat - Il devrait être sur le prix, pas la quantité. – ConnorU

Répondre

3

L'erreur est que vous utilisez docdate directement sans l'ajouter à la clause group by.

Je pense que c'est ce que vous voulez:

select ItemCode, 
    sum(Quantity) QuantitySold, 
    WhsCode as Store, 
    sum(price * case when docdate < '20170401' then 0.0052 else 0.005 end) as Tax 
from SalesTable 
group by whscode, 
    itemcode