PARTITION BY заявление об условиях - PullRequest
0 голосов
/ 05 ноября 2019

Я сделал запрос, который использует RowNumber() до PARTITION определенной таблицы, после чего я выбираю только строки WHERE RN = 1. Однако теперь я вижу, что мой текущий запрос недостаточен, поскольку раздел должен быть динамическим в зависимости от условия.

Результаты моего запроса приведены в таблице ниже, однако некоторые записи не должны быть включены:

PROJID          ITEMID  AMOUNT                  STARTDATE   TAXITEMGROUPID  MODELID     RN
300.201343.01   4101    9648168.000000000000    20171004    Hoog            Budget      1
300.201343.01   4102    0.000000000000          20171004    Hoog            Budget      1
300.201343.01   4201    204541.000000000000     20171004    Hoog            Budget      1
300.201343.01   4202    195750.000000000000     20171004    Hoog            Budget_21   1
300.201343.01   4205    52933.460000000000      20171004    Hoog            Budget      1
300.201343.01   4211    278400.000000000000     20171004    Hoog            Budget_21   1
300.201343.01   4212    34800.000000000000      20171004    Hoog            Budget      1
300.201343.01   4215    620448.000000000000     20171004    Hoog            Budget_21   1
300.201343.01   4304    8400.000000000000       20151030    Geen            Budget_12   1 --shouldn't have RN = 1
300.201343.01   4304    8700.000000000000       20171004    Hoog            Budget      1
300.201343.01   4305    8700.000000000000       20171004    Hoog            Budget      1
300.201343.01   4307    130500.000000000000     20171004    Geen            Budget      1
300.201343.01   4307    154728.000000000000     20151030    Laag            Budget_12   1 --shouldn't have RN = 1
300.201343.01   4309    41322.310000000000      20150216    Hoog            Budget_5    1

Например, я хочу, чтобы ITEMID 4304 был разбит на TAXITEMGROUPID, когда STARTDATE также совпадает. Когда STARTDATE отличается, я хочу, чтобы он был разбит только на PROJID и ITEMID. Таким образом, RN не должен быть 1 в последнем случае, где AMOUNT = 8400.

Это запрос, который я сейчас использую:

;WITH ApprovedBudget_Sales AS
(
    SELECT *
    ,ROW_NUMBER() OVER (PARTITION BY PROJID, ITEMID, TAXITEMGROUPID ORDER BY STARTDATE DESC) RN
    FROM FORECASTSALES
    WHERE APPROVED = 1 --AND PROJID = '300.201343.01'
)
SELECT
    FORECASTSALES.PROJID
    ,FORECASTSALES.ITEMID
    ,FORECASTSALES.SALESQTY AS AMOUNT
    ,CAST(DATEPART(YYYY,ApprovedBudget_Sales.STARTDATE) AS [CHAR](4))
       + RIGHT('0' + CAST(DATEPART(M,ApprovedBudget_Sales.STARTDATE) AS [VARCHAR](2)),2)  
       + RIGHT('0' + CAST(DATEPART(D,ApprovedBudget_Sales.STARTDATE) AS [VARCHAR](2)),2) AS STARTDATE
    ,FORECASTSALES.TAXITEMGROUPID
    ,MAX(FORECASTSALES.MODELID) AS MODELID
    ,RN
FROM FORECASTSALES
INNER JOIN ApprovedBudget_Sales
    ON ApprovedBudget_Sales.RECID = FORECASTSALES.RECID
    AND ApprovedBudget_Sales.DATAAREAID = FORECASTSALES.DATAAREAID
LEFT JOIN CATEGORYTABLE
    ON CATEGORYTABLE.CATEGORYID = FORECASTSALES.ITEMID
    AND CATEGORYTABLE.DATAAREAID = FORECASTSALES.DATAAREAID
WHERE ApprovedBudget_Sales.RN = 1 --AND FORECASTSALES.PROJID = '300.201343.01'
GROUP BY
    FORECASTSALES.DATAAREAID
    ,FORECASTSALES.TAXITEMGROUPID
    ,FORECASTSALES.SALESQTY
    ,FORECASTSALES.PROJID
    ,FORECASTSALES.ITEMID
    ,FORECASTSALES.ACTIVE
    ,CATEGORYTABLE.CATEGORYNAME
    ,ApprovedBudget_Sales.RN
    ,ApprovedBudget_Sales.STARTDATE
ORDER BY FORECASTSALES.PROJID, FORECASTSALES.ITEMID

Есть предложения?

С уважением, Игорь

...