Исключение совпадающих значений в наборе результатов 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