2010-01-22 8 views
0

J'ai une table SQL « ITM_SLS » avec les champs suivants:Sortie deux colonnes pour 1 champ pour différentes plages de dates?

ITEM 
DESCRIPTION 
TRANSACTION # 
DATE 
QTY SOLD 

Je veux être en mesure de sortie QTÉ vendu pour une valeur d'un mois et un an à la date de valeur afin que la sortie se présente comme suit :

ITEM, DESCRIPTION, QTY SOLD MONTH, QTY SOLD YEAR TO DATE 

Est-ce possible?

+0

Depends. Quelle base de données utilisez-vous? – womp

+0

Est-il logique que j'utilise une base de données SQL? – user256909

+0

C'est certainement Microsoft SQL Server. – user256909

Répondre

1

Vous pouvez calculer la quantité totale vendue à l'aide de group by dans une sous-requête. Par exemple

select a.Item, a.Description, b.MonthQty, c.YearQty 
from (
    select distinct Item, Description from TheTable 
) a 
left join (
    select Item, sum(Qty) as MonthQty 
    from TheTable 
    where datediff(m,Date,getdate()) <= 1 
    group by Item 
) b on a.Item = b.Item 
left join (
    select Item, sum(Qty) as YearQty 
    from TheTable 
    where datediff(y,Date,getdate()) <= 1 
    group by Item 
) c on a.Item = c.Item 

La méthode pour limiter la sous-requête à une plage de dates particulière diffère par SGBD, cet exemple utilise la fonction SQL Server datediff.

+0

Merci! Je vais l'essayer ... – user256909

+0

Merci encore! Je l'ai eu à travailler en utilisant votre modèle de code sauf que j'ai utilisé où date entre 'date1' et 'date2' au lieu de datediff (qui ne fonctionnait pas pour moi) alors je dois juste entrer mes propres valeurs de date ... – user256909

0

Cela vous donnera une idée de ce que vous pouvez faire:

select 
    ITEM, 
    DESCRIPTION, 
    QTY SOLD as MONTH, 
    (select sum(QTY SOLD) 
     from ITM_SLS 
     where ITEM = I.ITEM 
     AND YEAR = i.YEAR 
    ) as YEAR TO DATE 
from ITM_SLS I 
1

En supposant que le "un mois" est le mois dernier ...

select item 
     , description 
     , sum (case when trunc(transaction_date, 'MM') 
          = trunc(add_months(sysdate, -1), 'MM') 
        then qty_sold 
        else 0 
        end) as sold_month 
     , sum(qty_sold) as sold_ytd 
from itm_sls 
where transaction_date >= trunc(sysdate, 'yyyy') 
group by item, description 
/
+0

Belle requête. Petit problème: si vous interrogez à mi-chemin un mois, il comptera la deuxième moitié du mois de l'année dernière vers le total de ce mois. – Andomar

+0

@Andomar. Pas sûr de ce que vous voulez dire. La clause WHERE supprime toutes les transactions antérieures au début de l'année en cours. – APC

+0

Ah à droite, +1 alors :) Il s'avère que la question est pour SQL Server, donc tronqué ne fonctionnera pas, mais la somme (cas où 'serait – Andomar

Questions connexes