2015-11-14 24 views
6

Sto provando a utilizzare il codice riportato di seguito per portare un conteggio di tutte le linee negli ultimi 12 mesi per il periodo e impianto, vedere l'output di seguito. Quindi, ad esempio con l'output di seguito, anziché la colonna di 12 mesi che contiene il totale per il periodo, voglio il conteggio utilizzando un periodo compreso tra 201001-201101 (Si noti che il mio esempio era solo per il set di dati di seguito e i 12 mesi colonna deve adattarsi per ciascun periodo).Effettuare il conteggio dei 12 mesi precedenti durante il raggruppamento per periodo

Period Plant Stock Special MonthTotal 12Months 
201101 0EA0 27  0   27  27 
201101 0EB0 35 2   37  37 

Il problema che sto avendo è che invece di portare attraverso l'ultimo conteggio di 12 mesi, il mio codice è semplicemente portando attraverso il conteggio per il periodo in corso. Per favore qualcuno può aiutare?

select 
      convert(varchar(6),dateadd(mm,0,P.Dt),112) as Period,P.Plant, 
      Sum(Case When Left(Upper(Material),2) = 'ZZ' then 1 else 0 end) as Stock, 
      Sum(Case When Left(Upper(Material),2) <> 'ZZ' then 1 else 0 end) as Special 
      ,Count(*) as MonthTotal,Sum(Case When 
         convert(varchar(6),dateadd(mm,0,P.Dt),112) 
       Between 
         convert(varchar(6),dateadd(mm,-12,P.Dt),112)  
       And 
         convert(varchar(6),dateadd(mm,0,P.Dt),112) Then 1 else 0 End 
       )as [12Months] 
    from 
      iesaonline.dbo.DS_POs as P where 
           Plant IN(
        Select Client From METRICS.DBO.CO_001_Plants_090_Final 
            where CustGrp = 'Hovis' 
             ) 
    Group by 
      P.Plant,convert(varchar(6),dateadd(mm,0,P.Dt),112)         
    order by 
      convert(varchar(6),dateadd(mm,0,Dt),112),Plant  
+5

Si prega di creare un sql fiddle (sqlfiddle.com) contenente i campi da DS_POs e CO_001_Plants_090_Final che consente di ur sopra la query da eseguire. –

+1

Abbiamo bisogno di ulteriori informazioni, come lo schema del database e alcuni dati di esempio. Segui il suggerimento di W.Prins e crea uno sqlfiddle contenente dati inventati e un esempio della tua query corrente che non sta facendo quello che vuoi. –

risposta

3

Il problema sembra essere il raggruppamento per anno/mese e il tentativo di sommare i valori al di fuori di tale intervallo anno/mese. Senza dati di esempio, non posso esserne certo, ma sembra che tu voglia una somma di 12 mesi. Qualcosa di simile in basso dovrebbe portarti dove vuoi andare.

;with monthlySubtotal as 
    (
     select 
       dateadd(m, 1-datepart(day, p.dt), p.dt) as PeriodMonth 
       ,P.Plant 
       ,Sum(Case When Left(Upper(Material),2) = 'ZZ' then 1 else 0 end) as Stock 
       ,Sum(Case When Left(Upper(Material),2) <> 'ZZ' then 1 else 0 end) as Special 
       ,Count(*) as MonthTotal 
     from 
       iesaonline.dbo.DS_POs as P where 
            Plant IN(
         Select Client From METRICS.DBO.CO_001_Plants_090_Final 
             where CustGrp = 'Hovis' 
              ) 
     Group by 
       P.Plant 
       ,dateadd(m, 1-datepart(day, p.dt), p.dt) 
    ) 
SELECT 
    convert(varchar(6),m1.PeriodMonth,112) Period 
    , m1.Plant 
    , m1.Stock 
    , m1.Special 
    , m1.MonthTotal 
    , SUM(m2.monthtotal) 12mototal 
FROM monthlySubtotal m1 
JOIN monthlySubtotal m2 
    ON m2.plant = m1.plant 
    AND m2.periodmonth BETWEEN dateadd(m, -11, m1.periodmonth) 
     AND m1.periodmonth 
--You may want to filter this 
--WHERE m1.periodmonth >= startdate 
GROUP BY 
    convert(varchar(6),m1.PeriodMonth,112) 
    , m1.Plant 
    , m1.Stock 
    , m1.Special 
    , m1.MonthTotal 
ORDER BY 
    Period 
    , Plant 
3

Non è necessario fare tutto allo stesso tempo.

E 'più facile prima ottenere i valori mensili

SELECT DATEADD(month, DATEDIFF(month, 0, Dt), 0) as FOM 
    , Plant 
    , Stock = SUM(CASE WHEN LEFT(Upper(Material), 2) = 'ZZ' THEN 1 ELSE 0 END) 
    , Special = SUM(CASE WHEN LEFT(Upper(Material), 2) = 'ZZ' THEN 0 ELSE 1 END) 
FROM DS_POs 
GROUP BY Plant, DATEADD(month, DATEDIFF(month, 0, Dt), 0) 

e l'utilizzo che come base per ottenere l'ultimo 12 mesi di risultato utilizzando un CROSS APPLY

WITH DS_POSM AS (
    SELECT DATEADD(month, DATEDIFF(month, 0, Dt), 0) as FOM 
     , Plant 
     , Stock = SUM(CASE WHEN LEFT(Upper(Material), 2) = 'ZZ' THEN 1 ELSE 0 END) 
     , Special = SUM(CASE WHEN LEFT(Upper(Material), 2) = 'ZZ' THEN 0 ELSE 1 END) 
    FROM DS_POs 
    GROUP BY Plant, DATEADD(month, DATEDIFF(month, 0, Dt), 0) 
) 
SELECT Convert(char(6), FOM, 112) Period 
    , Plant 
    , Stock 
    , Special 
    , MonthTotal = Stock + Special 
    , ly.[12Months] 
FROM DS_POSM a 
     CROSS APPLY (SELECT Sum(Stock + Special) [12Months] 
        FROM DS_POSM lastyear 
        WHERE lastyear.FOM Between DateAdd(mm, -12, a.FOM) And a.FOM 
         AND lastyear.Plant = a.Plant 
        ) ly 
ORDER BY FOM, Plant 

DATEADD(month, DATEDIFF(month, 0, Dt), 0) ottenere il primo giorno del mese di Dt

+1

Penso che vuoi! = O <> per la somma speciale. Altrimenti dovrebbe funzionare anche questo. – JAQFrost

+1

@JasonQuinones stavo per scambiare lo 0 e l'1 poi ho dimenticato – Serpiton