Я работаю над запросом, чтобы найти повторяющиеся значения в ряде столбцов, поэтому я начну с того, что сосредоточусь на одной части запроса для лучшего объяснения.
В конце концов, все, что мне нужно знать, это если какой-либо из этих 4 столбцов имеет дубликат, и в каком столбце этот дубликат находится.
вот единственный запрос:
select count(*) as cnt, 'CUST_REF' as what_column
from sometable
where status != 'whateverStatus'
and custm_id = 1234
group by cust_ref having count(cust_ref) > 1;
Так что это прекрасно работает, за исключением вывода в 2 строки.Похоже, первая строка - это общее количество попаданий> 1 в столбце, а затем следующая строка - это фактическое количество дубликатов, например:
cnt what_column
9440 CUST_REF
2 CUST_REF
Мой вопрос: как мне получить эту вторую строку?без общего количества столбцов?(значение 2 является правильным для этого столбца) Т.е. я хочу только:
cnt what_column
2 CUST_REF
Собираем все вместе:
Я собираю все это вместе с UNION
, поэтому для 4 столбцов этобудет выглядеть так:
select count(*) as cnt, 'CUST_REF' as what_column
from sometable
where status != 'whateverStatus'
and custm_id = 1234
group by cust_ref having count(cust_ref) > 1
union
select count(*) as cnt, 'CUST_PO' as what_column
from sometable
where status != 'whateverStatus'
and custm_id = 1234
group by cust_po having count(cust_po) > 1
union
select count(*) as cnt, 'SHIP_BL' as what_column
from sometable
where status != 'whateverStatus'
and custm_id = 1234
group by ship_bl having count(ship_bl) > 1
union
select count(*) as cnt, 'CUST_SHIPID' as what_column
from sometable
where status != 'whateverStatus'
and custm_id = 1234
group by cust_shipid having count(cust_shipid) > 1;
И результат этого будет следующим: я хотел бы сгруппировать ВСЕ поля, которые показывают дубликаты, и ТАКЖЕ опустить этот общий счет.
cnt what_column
9440 CUST_REF
2 CUST_REF
332 CUST_PO
3 CUST_PO
2 CUST_PO
8 CUST_PO
4 CUST_PO
9 CUST_PO
37 CUST_PO
6 CUST_PO
5 CUST_PO
7 CUST_PO
11 CUST_PO
6609 SHIP_BL
2 SHIP_BL
5 SHIP_BL
8 SHIP_BL
3 SHIP_BL
4 SHIP_BL
6 SHIP_BL
7 SHIP_BL
9183 CUST_SHIPID
2 CUST_SHIPID
3 CUST_SHIPID
6 CUST_SHIPID
Опять же, в конце дня все, что мне нужно знать, это то, что в любом из этих 4 столбцов есть дубликат, и в каком столбце этот дубликат находится.
Для этих комментариевниже , я не могу поделиться данными таблицы.Но давайте посмотрим на это следующим образом, после добавления столбца обратно в выборку, которая находится в HAVING
:
select cust_ref as val, count(*) as cnt, 'CUST_REF' as what_column
from sometable
where status != 'whateverStatus'
and custm_id = 1234
group by cust_ref having count(cust_ref) > 1;
Все имена столбцов в HAVING
являются фактическими именами столбцов в этой таблице.what_column
- это просто псевдоним, который показывает мне, в каком столбце / запросе был обнаружен дубликат.
, скажем, данные выглядят так: я пометил дубликаты в первых 2 столбцах знаком *s.Я надеялся, что это смело бы их:
id | cust_ref | cust_po | ship_bl |cust_shipid
997| **1234** | 9656 | 5656 | 9876
998| **1234** | **6353**| 2436 | 9394
999| 4327 | **6353**| 4388 | 4353
Я почти уверен, что в итоге получу:
val cnt what_column
3 CUST_REF
1234 2 CUST_REF
Надеюсь, это поможет!