2015-11-14 10 views
6

अवधि अवधि और संयंत्र के लिए पिछले 12 महीनों की अवधि में सभी लाइनों की गणना करने के लिए मैं नीचे दिए गए कोड का उपयोग करने की कोशिश कर रहा हूं, कृपया नीचे दिए गए आउटपुट को देखें। तो उदाहरण के लिए, वर्तमान में अवधि के लिए कुल 12 महीने कॉलम के बजाय, नीचे दिए गए आउटपुट के साथ, मैं 201001-201101 के बीच की अवधि का उपयोग करके गिनती चाहता हूं (कृपया ध्यान दें, मेरा उदाहरण केवल नीचे डेटासेट और 12 महीने के लिए था कॉलम को प्रत्येक अवधि के लिए अनुकूलित करने की आवश्यकता है)।पिछले 12 महीनों के दौरान गिनती करते समय

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

मुद्दा मैं आ रही है कि नहीं बल्कि पिछले 12 महीने के गिनती के माध्यम से लाने की तुलना में, मेरे कोड केवल गिनती के माध्यम से वर्तमान अवधि के लिए ला रहा है है। कृपया कोई सहायता कर सकता है?

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

कृपया एक एसक्यूएल फिडल (sqlfiddle.com) बनाएं जिसमें DS_POs और CO_001_Plants_090_Final से फ़ील्ड शामिल हैं जो आपको अनुमति देता है चलाने के लिए उपर्युक्त क्वेरी। –

+1

हमें आपकी जानकारी स्कीमा और कुछ नमूना डेटा जैसे अधिक जानकारी चाहिए। कृपया डब्लू। प्रिंस के सुझाव का पालन करें और एक सक्लिफल्ड बनाएं जिसमें समेकित डेटा है और आपकी वर्तमान क्वेरी का एक उदाहरण है जो आप जो चाहते हैं वह नहीं कर रहा है। –

उत्तर

3

समस्या यह है कि आप वर्ष/माह से समूहीकरण और उस वर्ष/माह सीमा के बाहर मानों का योग करने की कोशिश कर रहे हो रहा है। नमूना डेटा के बिना, मैं निश्चित नहीं हो सकता, लेकिन ऐसा लगता है कि आप रोलिंग 12 महीने की राशि चाहते हैं। नीचे की तरह कुछ आपको प्राप्त करना चाहिए जहां आप जाना चाहते हैं।

;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

एक ही समय में सब कुछ करने की आवश्यकता नहीं है।

यह पहली मासिक मूल्यों

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) 

और आधार के रूप में एक 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) का उपयोग कर परिणाम की पिछले 12 महीने के प्राप्त करने के लिए है कि के पहले दिन मिल का उपयोग कर पाने के लिए आसान है Dt

+1

मुझे लगता है कि आप चाहते हैं! = या <> विशेष राशि के लिए। अन्यथा यह भी काम करना चाहिए। – JAQFrost

+1

@ जेसनक्विनोन मैं 0 और 1 को स्वैप करने जा रहा था तो मैं भूल गया – Serpiton

संबंधित मुद्दे