Как получить результаты, когда у даты есть специальное исключение - PullRequest
0 голосов
/ 09 октября 2019

Я вполне уверен, что могу использовать оператор CASE в этом случае, но я явно не смотрю на это право.

В моем предложении WHERE, когда метка даты находится в июле,Мне нужно сгруппировать и включить их в результаты за август. Вот то, что я пытаюсь, но мне не хватает отметки:

and CPTrn_DateTime = case
        when datepart(month, CPTrn_DateTime) = 7 then datepart(month, CPTrn_DateTime) in (7,8) 

Причина, по которой я пытался использовать оператор CASE, заключается в том, что только в июле месяценужно, чтобы эти результаты были связаны с результатами августа. Причина, по которой я не могу сделать простой диапазон дат, заключается в том, что мне нужно, чтобы логика работала для всех дат, движущихся вперед с течением времени.

Вот весь запрос:

DECLARE @month INT

SET @month = 8

SELECT DISTINCT cp.CPTrn_Key
    ,ch.Chg_Ref_No
    ,c.Cust_Alias
    ,ch.Chg_Total_Units
    ,ch.Chg_Amount
    ,cp.CPTrn_DateTime
FROM PDICompany_2049_01..CP_Transactions cp(NOLOCK)
INNER JOIN PDICompany_2049_01..Customers c(NOLOCK) ON CPTrn_Cust_Key = Cust_Key
INNER JOIN PDICompany_2049_01..Products p(NOLOCK) ON cp.CPTrn_Prod_Key = Prod_Key
LEFT JOIN PDICompany_2049_01..CP_Billing_Details CPBD(NOLOCK) ON CPBd.CPBillDtl_CPTrn_Key = cp.CPTrn_Key
    AND CPTrn_Cust_Key = CPBD.CPBillDtl_Cust_Key
    AND CPBD.CPBillDtl_Rec_Type = 1
LEFT JOIN PDICompany_2049_01..Customer_Locations cl(NOLOCK) ON c.Cust_WhPrcNtc_Def_CustLoc_Key = cl.CustLoc_Key
    AND ((CustLoc_Type & 2) <> 0)
LEFT JOIN Charges ch ON ch.Chg_Ref_No = cpbd.CPBillDtl_Invoice_No
WHERE cp.CPTrn_Tran_Type != 0
    AND c.Cust_Alias = 'MONTGOMERY CRANES, LLC'
    AND CPBillDtl_Invoice_No IS NOT NULL
    AND CPTrn_DateTime = CASE 
        WHEN datepart(month, CPTrn_DateTime) = 7
            THEN datepart(month, CPTrn_DateTime) IN (7,8)
        ELSE datepart(month, CPTrn_DateTime) = @month
        END AS 'CPTrn_DateTime'
ORDER BY 1

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Это выражение CASE (операторы Case не существуют в T-SQL) с функцией DATEPART может привести к снижению производительности.

Вы не «группируете» в WHERE, вы делаете это в своем GROUP By, поэтому я читаю через строки, но что не так с «нормальной» логикой дат?

WHERE CPTrn_DateTime >= '20190701'
  AND CPTrn_DateTime < '20190901'

Изменить: Простая логика даты по-прежнему то, что вы после:

DECLARE @Month int = 8,
        @Year int = 2019;

DECLARE @DateStart date = DATEFROMPARTS(@Year, IIF(@Month = 8, 7, @MOnth),1);
DECLARE @DateEnd date = DATEFROMPARTS(@Year, @Month+1, 1);

SELECT ...
FROM...
WHERE CPTrn_DateTime >= @DateStart
      AND CPTrn_DateTime < @DateEnd
0 голосов
/ 09 октября 2019

Или вы можете сделать все это в запросе:

SELECT DISTINCT cp.CPTrn_Key
    ,ch.Chg_Ref_No
    ,c.Cust_Alias
    ,ch.Chg_Total_Units
    ,ch.Chg_Amount
    ,cp.CPTrn_DateTime
FROM PDICompany_2049_01..CP_Transactions cp(NOLOCK)
INNER JOIN PDICompany_2049_01..Customers c(NOLOCK) ON CPTrn_Cust_Key = Cust_Key
INNER JOIN PDICompany_2049_01..Products p(NOLOCK) ON cp.CPTrn_Prod_Key = Prod_Key
LEFT JOIN PDICompany_2049_01..CP_Billing_Details CPBD(NOLOCK) ON CPBd.CPBillDtl_CPTrn_Key = cp.CPTrn_Key
    AND CPTrn_Cust_Key = CPBD.CPBillDtl_Cust_Key
    AND CPBD.CPBillDtl_Rec_Type = 1
LEFT JOIN PDICompany_2049_01..Customer_Locations cl(NOLOCK) ON c.Cust_WhPrcNtc_Def_CustLoc_Key = cl.CustLoc_Key
    AND ((CustLoc_Type & 2) <> 0)
LEFT JOIN Charges ch ON ch.Chg_Ref_No = cpbd.CPBillDtl_Invoice_No
WHERE cp.CPTrn_Tran_Type != 0
    AND c.Cust_Alias = 'MONTGOMERY CRANES, LLC'
    AND CPBillDtl_Invoice_No IS NOT NULL
    AND @month = case when month(CPTrn_DateTime) = 7 then 8 else month(CPTrn_DateTime) end

Я считаю order by 1 лишним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...