Mysql Group Показывая общее количество значений в столбце перед подсчитанными значениями, как это остановить? - PullRequest
0 голосов
/ 01 февраля 2019

Я работаю над запросом, чтобы найти повторяющиеся значения в ряде столбцов, поэтому я начну с того, что сосредоточусь на одной части запроса для лучшего объяснения.

В конце концов, все, что мне нужно знать, это если какой-либо из этих 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

Надеюсь, это поможет!

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Ваше объяснение того, что кажется очень простой проблемой, очень запутано, и вы не ясно объяснили, что вы хотите считать «дубликатом» - хотите ли вы подсчитать общее количество записей, где значение появляется больше, чемодин раз или количество значений, которые появляются более одного раза?

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

значение 2 является правильным для этого столбца

Это предполагает , вам нужен последний.В этом случае, поскольку:

select  cust_ref, 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;

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

SELECT COUNT(*) AS number_of_values_in_more_than_row, what_column
FROM (
   select  count(*) as cnt, 'CUST_REF' as what_column, cust_ref
   from sometable 
   where status != 'whateverStatus' 
      and custm_id = 1234
   group by cust_ref 
   having count(cust_ref) > 1
)
GROUP BY what_column

.... или ....

select  count(DISTINCT cust_ref) as cnt, 'CUST_REF' as what_column
from sometable 
where status != 'whateverStatus' 
    and custm_id = 1234
group by cust_ref 
having count(DISTINCT cust_ref) > 1;
0 голосов
/ 04 февраля 2019

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

SELECT sum(cnt) as dupes, COUNT(*) AS number_of_values_in_more_than_row, what_column
  FROM (
select  count(*) as cnt, 'CUST_REF' as what_column,cust_ref
 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,cust_po
 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,ship_bl
 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,cust_shipid
 from sometable 
  where status != 'whateverStatus' 
    and custm_id = 1234
 group by cust_shipid having count(cust_shipid) > 1
 )x
 GROUP BY what_column having count(number_of_values_in_more_than_row) >0;
0 голосов
/ 01 февраля 2019

У вас уже есть дубликаты.Итак, если вам нужны только столбцы без столбца cnt, выполните подзапрос:

select distinct what_column 
 from (
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);
...