Разделить на случай, когда - PullRequest
0 голосов
/ 01 октября 2019

В настоящее время я работаю над 6-месячным скользящим отчетом, но мне кажется, что я немного застрял в одной области.

У меня есть один столбец Liveatcutoff_PC, он будет заполнен 1 для живого или 0 для не живого. Если это 0, это означает, что он отменен. Я хочу определить% отмены для диапазона дат в моем коде, но мне не очень повезло.

SELECT 

UserID
,Agent
,COUNT(CASE WHEN SaleDate>=DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-6, 0)
    AND SaleDate < DATEADD(MONTH, DATEDIFF(MONTH, -6, GETDATE())-6, 0)
    AND LiveAtCutOff_PC='0' THEN LiveAtCutOff_PC END)

FROM PDS_SALES_PMI

WHERE SaleDate>='2019-01-01'
AND Leaver='0'
GROUP BY UserID, Agent

Помощь высоко ценится.

Ответы [ 2 ]

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

Если я правильно понимаю, вы можете использовать AVG():

AVG(CASE WHEN SaleDate >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-6, 0) AND
              SaleDate < DATEADD(MONTH, DATEDIFF(MONTH, -6, GETDATE())-6, 0)       THEN LiveAtCutOff_PC * 1.0
    END) as LiveAtCutoff_PC_ratio

Ваш вопрос указывает, что LiveAtCutOff_PC имеет значения 0 и 1, что подразумевает, что поле является числом,Однако код сравнивает его со строкой, что говорит об обратном. Если значения только 0 и 1, то вышеприведенное должно работать как для чисел, так и для строк (хотя для bit вам потребуется преобразовать значение).

0 голосов
/ 01 октября 2019

Таким образом, поскольку вам необходимо выяснить процент отмененных продаж, вам не нужно делать это в одном запросе. Case просто вычислит все, включая нули (которые появятся, потому что у вас нет 'else'), вы можете попробовать вместо этого использовать подзапрос или использовать CTE.

Пример CTE

with CTE as (
Select  UserID
       ,Agent
       ,COUNT(*) as Canceled
from PDS_SALES_PMI
where   SaleDate >=DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-6, 0)
    AND SaleDate < DATEADD(MONTH, DATEDIFF(MONTH, -6, GETDATE())-6, 0)
    AND LiveAtCutOff_PC='0'
    AND SaleDate >='2019-01-01'
    AND Leaver = 0
group by UserID, AgentID)

Select a.UserID
      ,a.AgentID
      ,Canceled/COUNT(*) * 100.0 as Canceled_Percent
From PDS_SALES_PMI a INNER JOIN CTE 
on  a.AgentID = CTE.AgentID
and a.UserID  = CTE.UserID
Where SaleDate >=DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-6, 0)
  AND SaleDate < DATEADD(MONTH, DATEDIFF(MONTH, -6, GETDATE())-6, 0)
  AND SaleDate >='2019-01-01'
  AND Leaver = 0
Group by a.UserID, a.AgentID

Пример подзапроса

Select a.UserID
          ,a.AgentID
          ,Canceled/COUNT(*) * 100.0 as Canceled_Percent
    From PDS_SALES_PMI a INNER JOIN (
                   Select  UserID
                          ,Agent
                          ,COUNT(*) as Canceled
                   from PDS_SALES_PMI
                   where SaleDate >=DATEADD(MONTH, DATEDIFF(MONTH, 0,GETDATE())-6, 0)
                     AND SaleDate < DATEADD(MONTH, DATEDIFF(MONTH, -6, GETDATE())-6, 0)
                     AND LiveAtCutOff_PC='0'
                     AND SaleDate >='2019-01-01'
                     AND Leaver = 0
                   group by UserID, AgentID) as Tmp
    on  a.AgentID = Tmp.AgentID
    and a.UserID  = Tmp.UserID
    Where SaleDate >=DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-6, 0)
      AND SaleDate < DATEADD(MONTH, DATEDIFF(MONTH, -6, GETDATE())-6, 0)
      AND SaleDate >='2019-01-01'
      AND Leaver = 0
    Group by a.UserID, a.AgentID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...