Подсчет промежуточных итогов - PullRequest
1 голос
/ 14 декабря 2011

Как я могу суммировать значения в Результате 1 как Результат 2

Result 1
    SalesRep    Customer    Product Quantity    Total
    Doe, John   AA Corp     P1      50          5000
    Doe, John   CA Corp     P2      67          6030
    Doe, John   EA Corp     P3      46          5980
    Doe, John   GA Corp     P2      22          1980
    Doe, John   HA Corp     P3      43          5590
    Doe, John   IA Corp     P1      35          3500 | Sum this two 
    Doe, John   IA Corp     P2      24          2160 | make second record 0
    Doe, John   JA Corp     P2      66          5940
    Doe, John   MA Corp     P4      59          7670 
    Doe, John   OA Corp     P2      43          3870 | Sum this two 
    Doe, John   OA Corp     P4      14          1820 | make second record 0
    Doe, John   PA Corp     P1      89          8900


Result 2
    SalesRep    Customer    Product Quantity    TotalPrice
    Doe, John   AA Corp     P1      50          5000
    Doe, John   CA Corp     P2      67          6030
    Doe, John   EA Corp     P3      46          5980
    Doe, John   GA Corp     P2      22          1980
    Doe, John   HA Corp     P3      43          5590
    Doe, John   IA Corp     P1      59          5660
    Doe, John   IA Corp     P2      0           0
    Doe, John   JA Corp     P2      66          5940
    Doe, John   MA Corp     P4      59          7670
    Doe, John   OA Corp     P2      57          5690
    Doe, John   OA Corp     P4      0           0
    Doe, John   PA Corp     P1      89          8900

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

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

SELECT 
  T.SalesRep, T.Customer, T.Product,
  CASE WHEN EXISTS (SELECT 1 FROM MyTable AS T1
                    WHERE T1.SalesRep = T.SalesRep
                    AND T1.Customer = T.Customer
                    AND T1.Product < T.Product)
       THEN 0
       ELSE SUM(T.Quantity) OVER (PARTITION BY T.SalesRep, T.Customer)
  END AS Quantity,
  CASE WHEN EXISTS (SELECT 1 FROM MyTable AS T1
                    WHERE T1.SalesRep = T.SalesRep
                    AND T1.Customer = T.Customer
                    AND T1.Product < T.Product)
       THEN 0
       ELSE SUM(T.Total) OVER (PARTITION BY T.SalesRep, T.Customer)
  END AS Total
FROM MyTable AS T

Для двух предложений CASE они гласят: «когда есть запись для одного и того же торгового представителя и клиента с меньшим продуктом (это мое предположение?), Затем обнулить значение. В противном случае суммировать все значения сгруппированы по торговому представителю и клиенту. Это также будет работать с более чем двумя (разными!) продуктами на торгового представителя и клиента.

Примечание : если в одной торговой точке может быть несколько идентичных продуктов. и клиент, это не сработает, и вам придется сравнить некоторые другие значения (например, T1.ID < T.ID) в двух вложенных выборках

Обратите также внимание : это может быть неправильно, так как я должен был сделать некоторые предположения относительно ваших требований.

2 голосов
/ 14 декабря 2011

Ну, если вам выслано нужны строки с нулями, то вы можете сделать это:

select salesrep,customer,min(product),sum(quantity) as quantity,sum(price) as totalprice
from results1
group by salesrep,customer
union
select salesrep,customer,max(product),0 as quantity,0 as totalprice
from results1
group by salesrep,customer
having count(1)>1;

Технически это не учитывает, что произойдет, если бы было большечем две (salesrep,customer,product) тройки, но это можно исправить, если MS-SQL имеет эквиваленты для функций generate_series() и rank() в PostgreSQL.

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