Исключение совпадающих значений в наборе результатов SQL

У меня есть таблица со списком транзакций (счета и кредиты), и мне нужно получить список всех строк, в которых счета и кредиты не совпадают.

например

user     product    value
bill     ThingA     200
jim      ThingA    -200
sue      ThingB     100
liz      ThingC      50

Я только хочу видеть третью и четвертую строки, поскольку значения других совпадают.

Я могу сделать это, если выберу продукт, сумма (значение) ... сгруппировать по продукту, имеющему сумму (значение) <> 0

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

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

Есть идеи? Я использую MS SQL 2000...

ура

2 ответа

Вы можете сделать так:

  SELECT tab2.user, product, sum_val
  FROM 
     (SELECT product, SUM(value) sum_val 
     FROM your_table
     GROUP BY product HAVING SUM(value) <> 0) tab1 
  INNER JOIN your_table tab2 
  ON tab1.product = tab2.product

Решение @LolCoder хорошо, но учитывая контекст, в котором у вас есть "Thing B" со значением "100" как "sue", так и "liz", вы могли бы получить следующий набор результатов с моим запросом:

| product | value | users    |
+----------------------------+
| Thing B | 200   | sue, liz |

Вот запрос:

select product
      ,sum(value) as value
      ,Stuff(( select ',' + convert(varchar(40), SQ.user)
                 from YourTable SQ
                where Q.product = SQ.product
                for xml path('')
            ), 1, 1, '') as users
  from YourTable Q
 group by Q.product
Другие вопросы по тегам