Подсчитайте прошедшие дни с начала финансового года для каждого квартала - PullRequest
0 голосов
/ 25 августа 2018

У меня есть следующий запрос, который представляет собой простой подсчет кварталов, но вместо этого я хочу произвести накопительный подсчет в соответствии с годом до даты (а не с предыдущей записью).Единственный способ добиться этого - через указатели?

MS SQL Server, а тип данных TPO_CQuarter - varchar.

Желаемый результат:

TPO_CQuarter Days
2016-1  112
2016-2  196
2016-3  280
2016-4  364
2017-1  111
2017-2  195
2017-3  279
2017-4  363
2018-1  112
2018-2  196
2018-3  280
2018-4  298

Запрос:

SELECT T.TPO_CQuarter
,COUNT(DISTINCT TPO_CFecha)
FROM TH_Rotacion R
INNER JOIN TD_Tiempo T ON R.TPO_KFECHA=T.TPO_KFecha
GROUP BY T.TPO_CQuarter
ORDER BY T.TPO_CQuarter ASC

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Вам нужна Совокупная сумма / Итоговая сумма :

SELECT T.TPO_CQuarter
   -- cumulative sum
   ,SUM(COUNT(DISTINCT TPO_CFecha))
    OVER (PARTITION BY SUBSTRING(TPO_CFecha FROM 1 FOR 4) -- reset for each year
          ORDER BY TPO_CQuarter
          ROWS UNBOUNDED PRECEDING)
FROM TH_Rotacion R
INNER JOIN TD_Tiempo T ON R.TPO_KFECHA=T.TPO_KFecha
GROUP BY T.TPO_CQuarter
ORDER BY T.TPO_CQuarter ASC
0 голосов
/ 25 августа 2018

Если у вас есть столбец года, вы можете выразить это как:

SELECT T.TPO_CQuarter,
       COUNT(DISTINCT TPO_CFecha) as days_in_quarter,
       SUM(COUNT(DISTINcT TPPO_CFecha) OVER (PARTITION BY T.TPC_CYear ORDER BY T.TPO_CQuarter) as days
FROM TH_Rotacion R INNER JOIN
     TD_Tiempo T
     ON R.TPO_KFECHA = T.TPO_KFecha
GROUP BY T.TPO_CQuarter, T.TPO_CYear
ORDER BY T.TPO_CQuarter ASC;

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

SELECT T.TPO_CQuarter,
       COUNT(DISTINCT TPO_CFecha) as days_in_quarter,
       SUM(COUNT(DISTINCT TPPO_CFecha) OVER (PARTITION BY LEFT(T.TPO_CQuarter, 4) ORDER BY T.TPO_CQuarter) as days
FROM TH_Rotacion R INNER JOIN
     TD_Tiempo T
     ON R.TPO_KFECHA = T.TPO_KFecha
GROUP BY T.TPO_CQuarter
ORDER BY T.TPO_CQuarter ASC;
0 голосов
/ 25 августа 2018

Попробуйте это:

SELECT TPO_CQuarter, SUM(Days) OVER (ORDER BY TPO_CQuarter) CumSum FROM (
    SELECT T.TPO_CQuarter
    ,COUNT(DISTINCT TPO_CFecha) Days
    FROM TH_Rotacion R
    INNER JOIN TD_Tiempo T ON R.TPO_KFECHA=T.TPO_KFecha
    GROUP BY T.TPO_CQuarter
    ORDER BY T.TPO_CQuarter ASC
) a

Оконная функция SUM с предложением ORDER BY действует как совокупная сумма.

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