Получить суммирование определенного столбца и последнего значения определенного столбца в каждой группе в результате запроса SQL с использованием SQL Server - PullRequest
0 голосов
/ 16 октября 2019

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

Это одна из моих попыток: здесь, когда я делаю ORDER BY "DATE" в ROW_NUMBER (), это приводит к другим результатам, я не могу сделать ORDER BY для другого столбца, потому что он бесполезенесли я не использовал ROW_NUMBER () в ORDER BY, и это невозможно.

WITH cte AS
(
    SELECT 
        SUM([ADB_LAST].[MA]) AS [MA],
        SUM([ADB_LAST].[DA]) AS [DA], 
        [ADB_LAST].[ID_BAS], 
        [ADB_LAST].[PRO_NUMBER], 
        [ADB_LAST].[ACC_NUMBER],
        [ADB_LAST].[DATA], [ADB_LAST].[DATE] AS MyDate,
        [ADB_LAST].[Q], 
        [ADB_LAST].[P], 
        RNum = ROW_NUMBER() OVER (PARTITION BY [ADB_LAST].[ACC_NUMBER] ORDER BY [ADB_LAST].[DATE] DESC),
        [ADB_LAST].[UNIT], 
        [ADB_LAST].[ID], 
        SUM([ADB_LAST].[R]) AS [R]
    FROM 
        [ADB_LAST](@PRO_NAME, @SDAY, @FDAY)
    GROUP BY 
        [ACC_NUMBER], [PRO_NUMBER], [DATA], [Q], [P],
        [UNIT], [ID], [ID_BAS], [DATE]
    HAVING 
        SUM([R]) <> 0
)
SELECT 
    MA, DA, 
    [ID_BAS],
    [PRO_NUMBER],
    [ACC_NUMBER],
    [DATA],
    [Date],
    [Q], [P],
    [UNIT],
    [ID],
    R
FROM 
    cte
WHERE 
    RNum = 1

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

Вот снимок экрана с результатом, в котором столбец "MA" имеет правильные значения суммирования, а столбец "DATE" имеет неправильные значения, дата первой строки должна быть 27/01/2008, что является значением DATE последней строки врезультат предыдущего запроса.

enter image description here

Ответы [ 3 ]

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

Это не совсем ответ, но это слишком долго для комментария, и комментарии не поддерживают приличное форматирование.

Говоря о форматировании .... добавление некоторых к вашему запросу вместе с псевдонимом превращает эту стену неразборчивого текста во что-то, что легко разобрать и понять.

WITH cte AS
(
    SELECT 
        SUM(l.MA) AS MA
        , SUM(l.DA) AS DA
        , l.ID_BAS
        , l.PRO_NUMBER
        , l.ACC_NUMBER
        , l.DATA
        , l.[DATE] as MyDate --you don't want to use reserved words as column names
        , l.Q
        , l.P
        , RNum = ROW_NUMBER() OVER (PARTITION BY l.ACC_NUMBER ORDER BY l.[DATE] desc)
        , l.UNIT
        , l.ID
        , SUM(l.R) AS R
    FROM ADB_LAST(@PRO_NAME, @SDAY, @FDAY) l
    GROUP BY ACC_NUMBER
        , PRO_NUMBER
        , DATA
        , Q
        , P
        , UNIT
        , ID
        , ID_BAS
        , DATE
    HAVING Sum(R) <> 0
)
SELECT MA
    , DA
    , ID_BAS
    , PRO_NUMBER
    , ACC_NUMBER
    , DATA
    , MyDate
    , Q
    , P
    , UNIT
    , ID
    , R
FROM cte
WHERE RNum = 1

Теперь, если мы только понялис какой проблемой вы сталкиваетесь.

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

Наконец я решил эту проблему, это была моя ошибка в чтении и сравнении данных в таблицах и в результатах. Эта ошибка вызвана поведением функции LAST в MS Access.

Мне очень жаль раздражать вас, ребята, по этому поводу.

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

Я бы использовал подзапрос над CTE в этом случае.

SELECT SUM(ADB_LAST.MA) AS MA
    , SUM(ADB_LAST.DA) AS DA
    , ADB_LAST.ID_BAS
    , ADB_LAST.PRO_NUMBER
    , ADB_LAST.ACC_NUMBER
    , ADB_LAST.[DATA]
    , ADB_LAST.Q
    , ADB_LAST.P
    , ADB_LASTDATE.MAXDATE AS [DATE]
    , ADB_LAST.UNIT, ADB_LAST.ID
    , SUM(ADB_LAST.R) AS R
FROM ADB_LAST
LEFT JOIN 
    ( 
    SELECT [ADB_LAST].[ACC_NUMBER]
        , MAX([ADB_LAST].[DATE]) AS MAXDATE 
    FROM [ADB_LAST] 
    GROUP BY [ADB_LAST].[ACC_NUMBER] 
    ) ADB_LASTDATE ON ADB_LASTDATE.[ACC_NUMBER] = ADB_LAST.ACC_NUMBER
GROUP BY ADB_LAST.ID_BAS
    , ADB_LAST.PRO_NUMBER
    , ADB_LAST.ACC_NUMBER
    , ADB_LAST.[DATA]
    , ADB_LAST.Q
    , ADB_LAST.P
    , ADB_LAST.UNIT
    , ADB_LAST.ID
    , ADB_LASTDATE.MAXDATE
HAVING (((SUM(ADB_LAST.R)) NOT LIKE 0));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...