Я пытаюсь суммировать все row_number = 1, но я бы хотел, чтобы он включал все другие строки, но отображал только запись для row_number 1, но суммировал все остальные строки.

SELECT 
    A.TEST, A.BLOCK, A.POLICY, A.SAL_COVERAGE,
    A.YEAR, A.ZIP, A.COVERAGE,
    SUM(A.WP) AS WP,
    SUM(A.WE) AS WE,
    SUM(A.EP) AS EP,
    SUM(A.EE) AS EE
FROM
    (SELECT
         ROW_NUMBER() OVER(PARTITION BY ZIP ORDER BY ZIP) AS TEST,
         BLOCK, POLICY, SAL_COVERAGE,
         YEAR, ZIP, COVERAGE,
         SUM(WP) AS WP,
         SUM(WE) AS WE,
         SUM(EP) AS EP,
         SUM(EE) AS EE
     FROM 
         [Reports].[dbo].[DGTESTING]
     GROUP BY
         BLOCK, POLICY, SAL_COVERAGE, YEAR, ZIP, COVERAGE) AS A
WHERE 
    TEST = 1
    AND A.POLICY = 'XXXX'
GROUP BY
    A.TEST, A.BLOCK, A.POLICY, A.SAL_COVERAGE, A.YEAR, A.ZIP, A.COVERAGE

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

enter image description here

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

Пример данных

--------------------------------------------------------------------------------------
|TEST|BLK|POL |SAL|YEAR|ZIP   |COV  |WP  |WE        |EP    |EE
--------------------------------------------------------------------------------------
|1   |1  |XXX |1  |2014|96003 |Bod  |-143|-10.888157|-87.59|-6.67
--------------------------------------------------------------------------------------
|32  |6  |XXX |1  |2015|96007 |Bod  |0   |0         |-55.41|-4.21
--------------------------------------------------------------------------------------

Ожидаемые данные

-------------------------------------------------------------------------------------
|TEST|BLK|POL|SAL|YEAR|ZIP  |COV|WP  |WE        |EP  |EE
--------------------------------------------------------------------------------------
|1   |  1|XXX|  1|2014|96003|Bod|-143|-10.888157|-143|-10.88
------------------------------------------------------------------------------------

Вот еще данные

More Date

0
David Gomez 14 Фев 2018 в 06:10
Можете ли вы показать некоторые данные с ожидаемым результатом, чтобы пойти с кодом
 – 
Harry
14 Фев 2018 в 06:12
Один из вариантов может заключаться в том, чтобы удалить части SUM из текущего подзапроса и просто выполнить соединение с другим подзапросом, который не делает ничего, кроме суммирования. например select * from (mysubquery) as a join (select policy, block, sal_coverage, etc, col1 = sum(col1), col2 = sum(col2), etc from mytable group by policy, etc) as b on a.policy = b.policy and a.othercols = b.othercols where a.test = 1 and a.policy = 'xxxx' или что-то подобное.
 – 
ZLK
14 Фев 2018 в 06:49
Добавил данные как мог с текстом. Надеюсь, это поможет. Я тоже попробую ваше предложение.
 – 
David Gomez
14 Фев 2018 в 07:01
Извините, @DavidGomez, я не понимаю, какой логике должен следовать запрос. Добавьте еще несколько строк к образцу данных и ожидаемому результату в вопросе. Пожалуйста, покажите все соответствующие варианты данных.
 – 
Vladimir Baranov
15 Фев 2018 в 01:29
@VladimirBaranov, я добавил все записи и ожидаемый результат. Я пытаюсь выполнить это более чем в одном подзапросе, поскольку я все еще борюсь с этим. Спасибо за вашу постоянную помощь.
 – 
David Gomez
15 Фев 2018 в 03:49

1 ответ

Лучший ответ

Приведенный ниже запрос вернет одну строку для всей таблицы, как в ожидаемом результате в вопросе. Он вернет одну строку с минимальным значением ZIP.

SUM(...) OVER() суммирует всю таблицу для каждой строки. Затем мы выбираем только одну строку с rn=1. Сначала запустите внутренний запрос, чтобы понять, что он делает.

SELECT 
    A.TEST
    ,A.BLOCK
    ,A.POLICY
    ,A.SAL_COVERAGE
    ,A.YEAR
    ,A.ZIP
    ,A.COVERAGE
    ,A.WP
    ,A.WE
    ,A.EP
    ,A.EE
FROM
    (
        SELECT
            ROW_NUMBER() OVER (ORDER BY ZIP) AS rn
            ,BLOCK
            ,POLICY
            ,SAL_COVERAGE
            ,YEAR
            ,ZIP
            ,COVERAGE
            ,SUM(WP) OVER() AS WP
            ,SUM(WE) OVER() AS WE
            ,SUM(EP) OVER() AS EP
            ,SUM(EE) OVER() AS EE
        FROM [Reports].[dbo].[DGTESTING]
    ) AS A
WHERE 
    rn = 1
;
0
Vladimir Baranov 15 Фев 2018 в 07:28
Это намного ближе к тому, что мне нужно, за исключением того, что у меня тысячи почтовых индексов, и все они должны быть свернуты в rn = 1. Значение rn = 1 должно складываться для каждого отдельного zip. Хотя это помогает мне стать ближе.
 – 
David Gomez
14 Фев 2018 в 08:01
@DavidGomez, хорошо, вы хотите разделить по Zip, хорошо. Как вы хотите упорядочить строки с одним и тем же почтовым индексом? Как определить «первую» строку, когда есть несколько строк с одним и тем же индексом Zip?
 – 
Vladimir Baranov
14 Фев 2018 в 08:10
Я пытаюсь использовать строку 1 в качестве zip для суммирования всех WP, EP, EE и WE.
 – 
David Gomez
14 Фев 2018 в 18:45
Спасибо. Это было бы правдой, если бы у меня был только один почтовый индекс, а у меня тысячи. Этот результат должен быть для каждого zip-архива, если я не выполняю запрос неправильно. Я буду продолжать копаться в этом. Чтобы объяснить свои проблемы, я привел только набор результатов для 1 zip, в который были включены два разных zip.
 – 
David Gomez
15 Фев 2018 в 09:05
@DavidGomez, если вы хотите получить полезные ответы, вы должны включить в свой вопрос такие образцы данных, чтобы ожидаемый результат иллюстрировал требуемую логику. Если вы ожидаете увидеть в результате более одной строки, тогда покажите нам хороший пример, когда это произойдет. Пока что я возвращаюсь к своему заявлению, что не понимаю, какая логика вам нужна.
 – 
Vladimir Baranov
15 Фев 2018 в 11:24