Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помощь с написании селекта с функцией cast  [new]
icef1ery
Member

Откуда:
Сообщений: 61
Здравствуйте уважаемые форумчане нужна помощь. Если кто поможет буду благодарен.
Есть 2 таблицы.
Первая таблица:
Название markcust
Поля idmarkcust (int), customer_id (int), mark_id (int).
(запрос select *)
Картинка с другого сайта.

Вторая таблица:
Название marka
Поля marka_id (int), marka (char).
(запрос select *)
Картинка с другого сайта.

Связь FK_markacust_marka между "marka" и "markacust"

Что необходимо покажу (на примере). Необходимо записать в одну строчку (ячейку) данные у которых одинаковый customer_id.
Пример:
select distinct markacust.customer_id, markacust.marka_id,  (select cast(marka_id as nvarchar) + ',' as 'data()'  
from [isp_dog].[dbo].[markacust] t2 where [isp_dog].[dbo].[markacust].customer_id = t2.customer_id  group by marka_id for xml path('') )
from [isp_dog].[dbo].[markacust]
group by markacust.marka_id, markacust.customer_id


Результат:
Картинка с другого сайта.

То есть distinct результат
Картинка с другого сайта.


А теперь к проблеме.
Данное соединение у меня получается только в текущей таблице, а мне необходимо соединить данные из справочника(дополнительной таблицы №2).

Но почему то когда я её соединяю join'ом и пишу запрос ответ она выводит не правильный.
Пример моего кода
select distinct markacust.customer_id, markacust.marka_id, marka.marka, (select cast((marka) as nvarchar) + ',' as 'data()' 
from [isp_dog].[dbo].[markacust] t2
left join [isp_dog].[dbo].[marka] on marka.marka_id=markacust.marka_id
where [isp_dog].[dbo].[markacust].customer_id = t2.customer_id for xml path('') )
from [isp_dog].[dbo].[markacust]
left join [isp_dog].[dbo].[marka] on marka.marka_id=markacust.marka_id


И результат
Картинка с другого сайта.

нужно получить следующие
SQL запрос должен вернуть следующие данные

Картинка с другого сайта.

или distinct значение необходимое в итоге

Картинка с другого сайта.

то есть в конечном итоге нужно вернуть только
marka1, marka2, marka3
вот это не получается

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

Если кто нибудь сможет помочь буду рад. Спасибо.
11 апр 13, 15:55    [14168005]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
Glory
Member

Откуда:
Сообщений: 104760
icef1ery
то есть в конечном итоге нужно вернуть только
marka1, marka2, marka3
вот это не получается

Ну так уберите markacust.customer_id, markacust.marka_id из списка полей запроса
11 апр 13, 15:57    [14168030]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
iap
Member

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

расставьте у всех таблиц алиасы!
11 апр 13, 15:58    [14168039]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
icef1ery
Member

Откуда:
Сообщений: 61
Glory
Ну так уберите markacust.customer_id, markacust.marka_id из списка полей запроса

Зачем, что то убирать пока не получен желаемый результат? как убрать ненужные поля я знаю. Мне нужно изначально получить правильный результат, а потом запрос уменьшится в разы (уберутся половина join'ов и select почистится).
11 апр 13, 16:15    [14168176]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
Glory
Member

Откуда:
Сообщений: 104760
icef1ery
Зачем, что то убирать пока не получен желаемый результат? как убрать ненужные поля я знаю. Мне нужно изначально получить правильный результат, а потом запрос уменьшится в разы (уберутся половина join'ов и select почистится).

Офигеть логика.
Я хочу получить правильный результат, но текст запроса менять не буду. Помогите.
11 апр 13, 16:17    [14168190]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
icef1ery
Member

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

расставьте у всех таблиц алиасы!

Почему то из за функции cast которая имеет у себя в структуре
cast( ........ as nvarchar)
не получается расставить алиасы к этому полю.
На запрос
select cast((marka_id as nvarchar) as 'new colum')
sql выдает "Неправильный синтаксис около ключевого слова "as"."
Если подскажите как это сделать буду благодарен.
11 апр 13, 16:20    [14168210]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
select cast((marka_id as nvarchar) as 'new colum')

facepalm.jpg


select cast(marka_id as nvarchar ) as "new colum"

а еще лучше

select [new colum] = cast(marka_id as nvarchar ) as

Кстати, nvarchar какого размера то?
11 апр 13, 16:31    [14168281]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
select [new colum] = cast(marka_id as nvarchar ([size]) )
11 апр 13, 16:32    [14168286]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
_djХомяГ
Guest
select '0'+cast(1 as varchar) as val
11 апр 13, 16:33    [14168293]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
icef1ery
Member

Откуда:
Сообщений: 61
Glory
Офигеть логика.
Я хочу получить правильный результат, но текст запроса менять не буду. Помогите.


Уважаемый Glory может быть мы не так друг друга поняли. Поясню еще раз.
Первое: что получается в данном запросе
Картинка с другого сайта.
Второе: что должно получится
Картинка с другого сайта.

Обратите пожалуйста внимание на последние столбцы. В первом случае, что получается. Во втором что хотелось бы иметь.

Если я уберу "markacust.customer_id, markacust.marka_id из списка полей запроса" то в Результате запроса просто уберется два первых столбца и не изменится результат в искомом последнем столбце.
11 апр 13, 16:34    [14168302]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
Glory
Member

Откуда:
Сообщений: 104760
icef1ery
Если я уберу "markacust.customer_id, markacust.marka_id из списка полей запроса" то в Результате запроса просто уберется два первых столбца и не изменится результат в искомом последнем столбце.

Значит надо убрать markacust.customer_id, markacust.marka_id, marka.marka

Вы вообще понимаете, как работает distinct ?

icef1ery
Второе: что должно получится

Вы определитесь с желаемым результатом. А то он у вас меняется
11 апр 13, 16:37    [14168327]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
icef1ery,

вам про про алиасы ТАБЛИЦ говорили, а не столбцов.
если б сразу расставили, такой ошибки вы бы не совершили:
select distinct markacust.customer_id, markacust.marka_id, marka.marka, (select cast((marka) as nvarchar) + ',' as 'data()' 
from [isp_dog].[dbo].[markacust] t2
left join [isp_dog].[dbo].[marka] on marka.marka_id=t2.marka_id
where [isp_dog].[dbo].[markacust].customer_id = t2.customer_id for xml path('') )
from [isp_dog].[dbo].[markacust]
left join [isp_dog].[dbo].[marka] on marka.marka_id=markacust.marka_id
11 апр 13, 16:48    [14168412]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
icef1ery
Member

Откуда:
Сообщений: 61
Glory
Значит надо убрать markacust.customer_id, markacust.marka_id, marka.marka

Вы вообще понимаете, как работает distinct ?


Да конечно я понимаю как работает distinct. И конечно я понимаю, что он не будет работать при таких полях в запросе. Изменяюсь, что не убрал его из примера. В пример я добавил markacust.customer_id, markacust.marka_id, marka.marka что бы было понятнее помогающим, что да как в базе.

Забудем о distinct.


Glory
Вы определитесь с желаемым результатом. А то он у вас меняется


Вообще конечный результат должен быть таким (уже с применением distinct).
Картинка с другого сайта.

Сейчас же у меня
Картинка с другого сайта.
11 апр 13, 16:54    [14168459]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
Glory
Member

Откуда:
Сообщений: 104760
select a.customer_id,
(select cast((b.marka) as nvarchar(200)) + ',' as 'data()' 
    from [isp_dog].[dbo].[marka] b where b.marka_id=a.marka_id
     for xml path('')) as x
from [isp_dog].[dbo].[markacust] a


Сообщение было отредактировано: 11 апр 13, 17:00
11 апр 13, 16:59    [14168494]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
icef1ery
Member

Откуда:
Сообщений: 61
Огромное спасибо.
iap за то что подсказал, но я не понял.
daw за то что разъяснил, что подсказал iap и Сделал мой день.
а также Glory и Cammomile за оказанную помощь.
Второй форум на котором я задавал данный вопрос. Но скорость ответов тут в 100 раз быстрее чем на первом. Спасибо еще раз всем кто помогал и форуму sql.ru.
11 апр 13, 17:00    [14168504]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
icef1ery
Member

Откуда:
Сообщений: 61
Glory
select a.customer_id,
(select cast((b.marka) as nvarchar(200)) + ',' as 'data()' 
    from [isp_dog].[dbo].[marka] b where b.marka_id=a.marka_id
     for xml path('')) as x
from [isp_dog].[dbo].[markacust] a

Вот вообще отлично Спасибо. Когда нибудь я также научусь. :)
11 апр 13, 17:02    [14168520]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
icef1ery
Member

Откуда:
Сообщений: 61
select distinct (select cast((marka) as nvarchar) + ',' as 'data()'
from [isp_dog].[dbo].[markacust] t2
left join [isp_dog].[dbo].[marka] on marka.marka_id=t2.marka_id
where [isp_dog].[dbo].[markacust].customer_id = t2.customer_id for xml path('') ) as new
from [isp_dog].[dbo].[markacust]
left join [isp_dog].[dbo].[marka] on marka.marka_id=markacust.marka_id

вот совершенно правильный работающий код. Спасибо.
11 апр 13, 17:11    [14168574]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
Glory
Member

Откуда:
Сообщений: 104760
icef1ery
вот совершенно правильный работающий код

Только офигительно избыточный
Зачем join-ы ? Чтобы дольше работало ?
11 апр 13, 17:13    [14168585]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с написании селекта с функцией cast  [new]
icef1ery
Member

Откуда:
Сообщений: 61
Glory
Только офигительно избыточный
Зачем join-ы ? Чтобы дольше работало ?


Согласен на счет последнего join'a он лишний, а вот без первого не обойтись (по моему).

select distinct (select cast((marka) as nvarchar) + ',' as 'data()' 
from [isp_dog].[dbo].[markacust] t2
left join [isp_dog].[dbo].[marka] on marka.marka_id=t2.marka_id
where [isp_dog].[dbo].[markacust].customer_id = t2.customer_id for xml path('') ) as new
from [isp_dog].[dbo].[markacust]


Если есть советы по оптимизации данного запроса то буду рад если поможете.
12 апр 13, 08:36    [14170756]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить