T-Sql найти повторяющиеся значения строк - PullRequest
0 голосов
/ 20 ноября 2011

Я хочу написать хранимую процедуру.

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

Допустим, у меня есть таблица CustomerSales;

ID  SalesRepresentative Customer  Quantity 
1   Michael             CustA        55     
2   Michael             CustA        10

и мне нужно превратить таблицу в ...

ID  SalesRepresentative Customer  Quantity 
1   Michael             CustA        65     
2   Michael             CustA        0

Когда я нахожу дубликаты SalesRepresentative и Customer одновременно, я хочу суммировать всеQuantity значения этих строк и присвоения первой строке таблицы, а остальные будут равны '0'.

Не могли бы вы мне помочь.

1 Ответ

2 голосов
/ 20 ноября 2011

Для объединения дубликатов в одну строку :

SELECT min(ID) AS ID, SalesRepresentative, Customer
      ,sum(Quantity) AS Quantity
FROM   CustomerSales 
GROUP  BY SalesRepresentative, Customer
ORDER  BY min(ID)

Или, если вы действительно хотите, чтобы эти дополнительные строки имели 0 как Quantity врезультат:

SELECT ID, SalesRepresentative, Customer
      ,CASE 
          WHEN (count(*) OVER (PARTITION BY SalesRepresentative,Customer)) = 1
             THEN Quantity
          WHEN (row_number() OVER (PARTITION BY SalesRepresentative,Customer
                                   ORDER BY ID)) = 1 
             THEN sum(Quantity) OVER (PARTITION BY SalesRepresentative,Customer)
          ELSE 0
       END AS Quantity
FROM   CustomerSales
ORDER  BY ID

Это интенсивно использует оконные функции .

Альтернативная версия без оконных функций:

SELECT min(ID) AS ID, SalesRepresentative, Customer, sum(Quantity) AS Quantity
FROM   CustomerSales 
GROUP  BY SalesRepresentative, Customer

UNION ALL 
SELECT ID, SalesRepresentative, Customer, 0 AS Quantity
FROM   CustomerSales c
GROUP  BY SalesRepresentative, Customer
LEFT   JOIN (
    SELECT min(ID) AS ID
    FROM   CustomerSales 
    GROUP  BY SalesRepresentative, Customer
   ) x ON (x.ID = c.ID)
WHERE  x.ID IS NULL
ORDER  BY ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...