sql - management - سكل سوم متد و يتد



sql server 2008 r2 iso (2)

يمكنك القيام بذلك مع التجميع الشرطي:

select sum(case when year(docdate) = year(getdate()) then InvValue end) as YTD,
       sum(case when year(docdate) = year(getdate()) and month(docdate) = month(getdaate())
                then InvValue
           end) as MTD
from table t;

هذا يفترض أنه ليس لديك تواريخ مستقبلية في الجدول. إذا قمت بذلك، أضف في docdate < getdate() إلى كل من العبارات.

تصحيح:

إذا كنت بحاجة إلى ذلك في صفين، يمكنك ببساطة القيام بذلك:

select (case when n.n = 1 then 'YTD' else 'MTD' end) as which,
       (case when n.n = 1 then YTD else MTD end) as value
from (select sum(case when year(docdate) = year(getdate()) then InvValue end) as YTD,
             sum(case when year(docdate) = year(getdate()) and month(docdate) = month(getdaate())
                      then InvValue
                 end) as MTD
      from table t
     ) cross join
     (select 1 as n union all select 2) n;

لقد بدأت للتو في النظر في سكل.

لدي قاعدة بيانات سكل سيرفر 2008 r2 التي ستعود حقلين دوكديت & إنففالو. أنا بحاجة إلى جمع إنففالويس كما متد و يتد اعتبارا من تاريخ اليوم لذلك يبدو

**Period** ///////  **Total value**
MTD        ////////////111111.11
YTD       /////////////999999.99

لقد فعلت كمية لا بأس بها من غوغلينغ ويمكن أن تفعل واحدة أو أخرى مع سوم و داتيبارت، ولكن أنا عالقة مع محاولة القيام على حد سواء.

يمكن لشخص تعطيني بعض الكود الزائفة التي من شأنها أن تساعد لي جوجل أبعد قليلا.

شكرا لكGordon لينوف، التي ساعدت كثيرا وتعلمت شيئا، وهذا سوف تجد مفيدة في المستقبل. يبدو الرمز الآن كما يلي:

SELECT
SUM(CASE WHEN YEAR(T1.[DocDate]) = YEAR(GETDATE()) THEN T0.[TotalSumSy] END) AS YTD,
SUM(CASE WHEN YEAR(T1.[DocDate]) = YEAR(GETDATE()) AND MONTH(T1.[DocDate]) = MONTH(GETDATE()) THEN T0.[TotalSumSy] END) AS MTD

FROM [dbo].[INV1] T0 INNER JOIN [dbo].[OINV] T1 ON T1.[DocEntry] = T0.[DocEntry]

ومع ذلك أحصل الآن

YTD.........MTD
99999.99....111111.11

وأنا بحاجة

YTD........99999.99
MTD........11111.11

وستكون أي مساعدة إضافية موضع تقدير.


Answer #1
SELECT
  Period = 'MTD',
  Total_value = SUM(T0.TotalSumSy) 
FROM dbo.INV1  T0 
  INNER JOIN dbo.OINV  T1 
     ON T1.DocEntry = T0.DocEntry
WHERE 
    T1.DocDate >= DATEADD(month,DATEDIFF(month,'20010101',GETDATE()),'20010101')
  AND 
    T1.DocDate < DATEADD(month,1+DATEDIFF(month,'20010101',GETDATE()),'20010101')

UNION ALL

SELECT
  'YTD', 
  SUM(T0.TotalSumSy) 
FROM dbo.INV1  T0 
  INNER JOIN dbo.OINV  T1 
     ON T1.DocEntry = T0.DocEntry
WHERE 
    T1.DocDate >= DATEADD(year,DATEDIFF(year,'20010101',GETDATE()),'20010101')
  AND 
    T1.DocDate < DATEADD(year,1+DATEDIFF(year,'20010101',GETDATE()),'20010101') ;

يتم استخدام الشروط (المعقدة) في عبارات WHERE بدلا من YEAR(column) = YEAR(GETDATE() والأخرى التي سبق أن تستخدمها، لذا يمكن استخدام الفهارس عندما تقوم بتطبيق دالة على عمود، يمكنك جعل الفهارس غير صالحة للاستخدام (مع بعض الاستثناءات الطفيفة لبعض الوظائف وبعض فيريوس من سكل سيرفر.) لذا، فإن أفضل شيء هو محاولة لتحويل الشروط لهذا النوع:

column <operator> AnyComplexFunction()




sql-server-2008-r2