Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Оператор HAVING не хочет считать значения в сцепке  [new]
NoahG
Member

Откуда:
Сообщений: 6
Доброе время суток уважаемые форумчанены. Столкнулся с проблемой, что оператор HAVING не выдаёт предполагаемого значения, возможно, я просто зациклился на нём и ошибка в другом.
Есть таблица:
Code TYPE
1111 CAR
1222 MOTO
1131 MOTO
3221 CAR
Мне необходимо найти значения, где первая цифра и последняя совпадает (то есть 1111 соответствует 1131)
Мой вариант:

SELECT a. Code, SUBSTRING(a. Code, 1, 1) + SUBSTRING(a.Code, 4, 4)
FROM Sale a
WHERE type IN ('CAR', 'MOTO')
GROUP BY a. Code
HAVING count(SUBSTRING(a. Code, 1, 1) + SUBSTRING(a.Code, 4, 4)) > 1

Буду благодарен, если натолкнёте на верное решение.
24 окт 17, 10:24    [20894807]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
_djХомяГ
Guest
SUBSTRING(a.Code, 4, 4)) а где аггрегат
24 окт 17, 10:26    [20894812]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
_djХомяГ
Guest
промахнулся сорри
24 окт 17, 10:28    [20894817]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
NoahG,

COUNT(Expression) что возвращает по-вашему?
Чего вы хотели добиться?
24 окт 17, 10:40    [20894858]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
Добрый Э - Эх
Guest
NoahG,

зачем HAVING? почему не WHERE?
24 окт 17, 10:42    [20894861]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
Добрый Э - Эх
Guest
select *
 from (values
('1111', 'CAR'),
('1222', 'MOTO' ),
('1131', 'MOTO'),
('3221', 'CAR'))v([code], [TYPE])

where  SUBSTRING([code], 1, 1) = SUBSTRING([code], 4, 4)
24 окт 17, 10:43    [20894866]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
982183
Member

Откуда: VL
Сообщений: 3349
SUBSTRING([code], 4, 1)
24 окт 17, 10:51    [20894898]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
NoahG
Member

Откуда:
Сообщений: 6
iap
NoahG,

COUNT(Expression) что возвращает по-вашему?
Чего вы хотели добиться?


Благодаря SUBSTRING у меня преобразуются значения в
1111 -> 11
1131 -> 11
Оба полученных значения равны друг другу, соответственно HAVING count(...) > 1
на выходе мне должен выдать 1111
1131
24 окт 17, 10:56    [20894917]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
Добрый Э - Эх
Guest
NoahG,

ещё раз:
почему HAVING, а не WHERE ?
24 окт 17, 10:58    [20894924]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
982183
Member

Откуда: VL
Сообщений: 3349
Вы явно не понимаете что делают HAVING и count
Не нужны они тут
24 окт 17, 10:58    [20894925]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
Добрый Э - Эх
Guest
NoahG,

а если хочешь сравнивать РАЗНЫЕ строки таблицы - то это прямая дорога к джойнам.
24 окт 17, 11:00    [20894933]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
982183
Member

Откуда: VL
Сообщений: 3349
NoahG
Оба полученных значения равны друг другу,


11 это не "оба значения", а одно.
24 окт 17, 11:00    [20894934]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
NoahG
Member

Откуда:
Сообщений: 6
982183
SUBSTRING([code], 4, 1)


Согласен, однако, это не критическая ошибка, так как у меня только значения с 4мя знаками ваше замечание верно, но это не решает проблемы, всё равно запрос ничего не выдаёт
24 окт 17, 11:01    [20894936]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
982183
Member

Откуда: VL
Сообщений: 3349
NoahG,
Это относилось к 20894866
24 окт 17, 11:03    [20894943]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
NoahG
Member

Откуда:
Сообщений: 6
982183
Вы явно не понимаете что делают HAVING и count
Не нужны они тут


спасибо за ответ, пойду перечитаю мануал, может на самом деле всё проще чем я себе напридумывал.
24 окт 17, 11:03    [20894944]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
982183
Member

Откуда: VL
Сообщений: 3349
Либо задача неправильно сформулирована.
24 окт 17, 11:03    [20894946]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
Добрый Э - Эх
Guest
NoahG,
with
  t ([code], [TYPE]) as 
    (
	  select *
	   from (
	          values ('1111', 'CAR'),
                     ('1222', 'MOTO' ),
                     ('1131', 'MOTO'),
                     ('3221', 'CAR'))v(x,y)
	)

select t.* 
  from t 
  join (
         select SUBSTRING([code], 1, 1) x1,  SUBSTRING([code], 4, 1) x2
           from t
          group by SUBSTRING([code], 1, 1),  SUBSTRING([code], 4, 1), SUBSTRING([code], 1, 1) + SUBSTRING([code], 4, 1)
         having count(1) > 1
       ) v
  on  SUBSTRING([code], 1, 1) = x1
  and SUBSTRING([code], 4, 1) = x2


Ну или на аналитическом (оконном) count(1) over(partitoin by ) с подзапросом... если версия сервера позволяет.
24 окт 17, 11:05    [20894951]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх
Ну или на аналитическом (оконном) count(1) over(partitoin by ) с подзапросом... если версия сервера позволяет.

with
  t ([code], [TYPE]) as 
    (
	  select *
	   from (
	          values ('1111', 'CAR'),
                     ('1222', 'MOTO' ),
                     ('1131', 'MOTO'),
                     ('3221', 'CAR'))v(x,y)
	)

select v.* 
  from (
         select t.*
              , count(1) over(partition by SUBSTRING([code], 1, 1) +  SUBSTRING([code], 4, 1)) as cnt
           from t
       ) v
 where cnt > 1
24 окт 17, 11:08    [20894963]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
982183
Member

Откуда: VL
Сообщений: 3349
Добрый Э - Эх,

а что в результате получится?
24 окт 17, 11:10    [20894972]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
Добрый Э - Эх
Guest
982183,

выполни и посмотри. секция WITH представляет собой тестовые данные .
Запросы полностью рабочий , на версиях от 2005 и выше...
24 окт 17, 11:13    [20894986]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
982183
Member

Откуда: VL
Сообщений: 3349
Я в том смысле, как ты интерпретировал цель ТС ?
24 окт 17, 11:19    [20895010]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
Добрый Э - Эх
Guest
982183
Я в том смысле, как ты интерпретировал цель ТС ?
По вот этой фразе автора:
NoahG
Мне необходимо найти значения, где первая цифра и последняя совпадает (то есть 1111 соответствует 1131)
24 окт 17, 11:21    [20895014]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
Добрый Э - Эх
NoahG,

ещё раз:
почему HAVING, а не WHERE ?
Как написано в документации, если в HAVING нет агрегатных функций,
то оно абсолютно эквивалентно WHERE.
Разве что логически выполняется позднее.
24 окт 17, 11:24    [20895020]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
982183
Member

Откуда: VL
Сообщений: 3349
NoahG
Мне необходимо найти значения, где первая цифра и последняя совпадает (то есть 1111 соответствует 1131)
.

Первая и последняя цифра чего?
Первая и последняя цифра совпадают в 1111 и в 1131
Но друг другу они не "соответствуют". Они обладают одним признаком.

В прилагаемом примере одним признаком обладают две записи.
А если их будет больше?
А если будут записи, обладающие другим признаком?
2002
2132

?

Как это всё выводить?
24 окт 17, 11:33    [20895045]     Ответить | Цитировать Сообщить модератору
 Re: Оператор HAVING не хочет считать значения в сцепке  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
Добрый Э - Эх
982183
Я в том смысле, как ты интерпретировал цель ТС ?
По вот этой фразе автора:
NoahG
Мне необходимо найти значения, где первая цифра и последняя совпадает (то есть 1111 соответствует 1131)



И эту задачу решает partition by SUBSTRING(code, 1, 1) + SUBSTRING(code, 4, 1), да?
Может,
PARTITION BY CASE LEFT(Code,1) WHEN RIGHT(Code,1) THEN 0 END
?
24 окт 17, 11:37    [20895060]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить