powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / хитрый (ну может быть не особо :) запрос
13 сообщений из 13, страница 1 из 1
хитрый (ну может быть не особо :) запрос
    #32007888
am (a_mitin)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем то вот такая необходимость образовалась...
Есть таблица товаров:
CREATE TABLE Item (ID INT PRIMARY KEY, Name varchar(50) NOT NULL)
INSERT INTO Item VALUES(1,'Товар1')
INSERT INTO Item VALUES(2,'Товар2')
Есть таблица возможных упаковок товара (каждый товар может приходить в разных упаковках) по 6 шт, по 12 шт и т.д.
CREATE TABLE ItemBox (ID_ITEM INT NOT NULL, InBox varchar(50) NOT NULL)
INSERT INTO ItemBox VALUES(1,6)
INSERT INTO ItemBox VALUES(1,12)
INSERT INTO ItemBox VALUES(2,10)
INSERT INTO ItemBox VALUES(2,18 )
INSERT INTO ItemBox VALUES(2,24)
Как методами SQL получить в итоге:
Товар DSK
Товар1 6,12
Товар2 10,18,24

В Access-SQL в принципе возможно например с пом. Update Query в пустое поле временной таблицы эту информацию собрать, а вот как в T-SQL что то никак непридумаю

2Moderater: кстати, почему NickName из 2х символов зажали?

С уважением, Андрей Митин
ICQ 38607432
http://am.rusimport.ru
...
Рейтинг: 0 / 0
хитрый (ну может быть не особо :) запрос
    #32007892
Фотография Александр Гладченко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> 2Moderater: кстати, почему NickName из 2х символов зажали?

У нас с этим связаны плохие воспоминания...
...
Рейтинг: 0 / 0
хитрый (ну может быть не особо :) запрос
    #32007897
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
create function Fun(@ID as integer) returns varchar(8000) as
begin
declare @Fun varchar(8000)
set @Fun = ''
select @Fun = @Fun + InBox + ' ' from ItemBox where ItemBox.ID_Item = @ID
return @Fun
end

select Name, dbo.Fun(ID) from Item
...
Рейтинг: 0 / 0
хитрый (ну может быть не особо :) запрос
    #32007904
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Garya Привилегированный пользователь
Участник
Здравствуй, Андрей! Рад старым MAUG-овцам. Похоже, киты MAUG постепенно перекочевывают сюда. Здесь же Павел с Кузбаса кантуется (ему тоже привет).
А по сути хотелось бы узнать версию SQL-сервера. Дед Маздай привел вариант для SQL2K. А для 7.0 это делается с помощью SP (если не совру, ранее на аналогичную тему предлагал решение на этом форуме SergSuper).
Кстати, я решаю аналогичную задачу (речь идет о масштабируемости единиц измерений), можем по мылу обсудить. Давно над ней медитирую... Если что, пиши hydro@corbina.ru.
Андрей Гордиенко
...
Рейтинг: 0 / 0
хитрый (ну может быть не особо :) запрос
    #32007906
am (a_mitin)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Дед Маздай
Извиняюсь, что не сказал сразу. SQL Server 7.0
...
Рейтинг: 0 / 0
хитрый (ну может быть не особо :) запрос
    #32007915
am+(a_mitin)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
4Garya:Привет, Андрей!
Рад что узнал!
Кстати случайно тут увидел внизу твоё сообщение (как всегда развернутое и интересное про рекурсивные процедуры.
Там ты как раз упомянул красным словцом однопроходный UPDATE в SQL Server. Здесь кстати такая же история В Access запрос типа
UPDATE ItemTMP INNER JOIN ItemBox ON ItemTMP.Item = ItemBox.ID_T SET ItemTMP.DSK = ItemTMP.DSK+"," & [ItemBox].[InBox];
как раз обновит поле DSK в ItemTMP до значения типа "6,12" (для товара 1 из моего примера).
Я наивный тоже хотел в SQL сделать - заполняет только 6

да, SQL Server как я уже сказал 2ДедМаздай - 7.0

А по поводу масшатабируемости единиц измерения (ЕИ)... Насколько я помню в MAUG ты как то очень подробно объяснял принципы учета в различных ЕИ в системах... Я думал здесь тебе всё предельно ясно Или опять что то хитрое придумал?

С уважением, Андрей Митин
ICQ 38607432
http://am.rusimport.ru
...
Рейтинг: 0 / 0
хитрый (ну может быть не особо :) запрос
    #32007961
Wild_V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создаёшь курсор - объединение Item и ItmBox по ID -> Item_id :
1 6
1 12
2 10
2 18
2 24

И времянку
Item_ID (int) InBoxes (varchar(256)

Бежишь по курсору, накапливаешь строчку, при смене Item_ID -скидываешь во времянку. Читаешь всё из времянки.

Код писать лень...
...
Рейтинг: 0 / 0
хитрый (ну может быть не особо :) запрос
    #32007967
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Garya Привилегированный пользователь
Участник
Вариант 1 на курсорах:
--------------------------------------------------
declare @LongString varchar(200)
declare @CurName varchar(50)
declare @ID int
declare Curs CURSOR
FOR SELECT * FROM Item
OPEN Curs
create table #TempTable (Name varchar(50), LongString varchar(200))
FETCH NEXT FROM Curs into @ID, @CurName
while @@FETCH_STATUS = 0
begin
set @LongString=''
select @LongString=@LongString+InBox+', ' from ItemBox where ID_ITEM=@ID
insert into #TempTable (Name, LongString) values (@CurName, @LongString)
FETCH NEXT FROM Curs into @ID, @CurName
end
close Curs
deallocate Curs
select * from #TempTable
-----------------------------------------

Вариант 2 без курсоров. Правда, чтобы он корректно работал, нужно добавить в таблицу ItemBox еще одно поле LongString varchar(200) и создать по этой таблице кластерный индекс по полям ID_Item и InBox. Этот вариант грешит своими недостатками. Кроме того, он нуждается в доработке, поскольку в конце каждой строки лишняя запятая, но это ведь дело поправимое (главное идея):
-----------------------------------------
declare @LongString varchar(200)
declare @previouseID_Item int
set @previouseID_Item=0
update ItemBox set @LongString=LongString=(case when @previouseID_Item=ID_Item then @LongString+cast(InBox as varchar(10))+',' else cast(InBox as varchar(10))+',' end), @previouseID_Item=ID_Item
from ItemBox

select I.[Name],B.MLongString from item I, (select top 100 percent max([ID_Item]) as [ID], max(cast(InBox as int)) as MInBox , max(LongString) as MLongString from ItemBox group by Id_Item) B
where I.[ID]=B.[ID]
---------------------------------------------------

>А по поводу масшатабируемости единиц измерения (ЕИ)... Насколько я помню в MAUG ты как то очень подробно объяснял принципы учета в различных ЕИ в системах...

И правда, было такое. Забыл уже .
...
Рейтинг: 0 / 0
хитрый (ну может быть не особо :) запрос
    #32008025
Wild_V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Garya

Как по мне - лажа

>select @LongString=@LongString+InBox+', ' from ItemBox where >ID_ITEM=@ID

Тут ругнётся - у тебя возвращается больше, чем одна запись...

Я ж говорю:
>Создаёшь курсор - ОБЪЕДИНЕНИЕ Item и ItmBox по ID -> Item_id :

Код писать всё ещё лень...
...
Рейтинг: 0 / 0
хитрый (ну может быть не особо :) запрос
    #32008045
am (a_mitin)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Wild_V

Вполне работоспособный вариант:
--vvvvvvvvvvvvvvvvvvvvvv
declare @LongString varchar(200)
--declare @CurName varchar(50)
declare @ID int
declare Curs CURSOR FOR SELECT Item FROM ItemBox GROUP BY Item
OPEN Curs
FETCH NEXT FROM Curs into @ID
while @@FETCH_STATUS = 0
begin
SET @LongString=''
SELECT @LongString=CASE WHEN @LongString='' THEN '' ELSE @LongString+',' END + rtrim(cast(InBox as varchar(10))) FROM ItemBox WHERE ITEM=@ID
--UPDATE #tmp SET DSK= @LongString WHERE ITEM=@ID
INSERT INTO #tmp (ITEM,DSK) VALUES (@ID, @LongString)
FETCH NEXT FROM Curs into @ID
end
close Curs
deallocate Curs
--^^^^^^^^^^^^^^^^^^^

Всем большое спасибо...
Да и внизу (ну оччень далеко ) нашел подобные вопросы
...
Рейтинг: 0 / 0
хитрый (ну может быть не особо :) запрос
    #32008132
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Garya Привилегированный пользователь
Участник
2 Wild_V. Не знаю, о какой лаже вы говорите. Я запустил этот код полминуты назад:
declare @ttt varchar(4000)
set @ttt=''
select @ttt=@ttt+[Name]+',' from syscolumns
select @ttt

Все работает! Правда, у меня SQL2K. Может, у вас какая-то старая версия?
...
Рейтинг: 0 / 0
хитрый (ну может быть не особо :) запрос
    #32008133
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Garya Привилегированный пользователь
Участник
2 am. Вариант 1 я не тестировал. А вот вариант 2 для меня показался более интересным. Его я протестировал перед тем как класть в постинг - точно работает.
...
Рейтинг: 0 / 0
хитрый (ну может быть не особо :) запрос
    #32008137
am (a_mitin)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Garya
Привет, Андрей.
Да, второй вариант интересный, но он подразумевает хранение ещё одного поля и несмотря на это использование хранимой процедуры для его заполнения и выборки...
Вообще то в моем случае мне проще всего сделать доп. текстовое поле в основной табл (Item) и поддерживать его актуальность на триггерах при изменении второй таблицы...
Жаль вот только у mdb триггеров нет ) База работает в 2х вариантах, так что придется не в SQL версии поддерживать такую актуальность на клиенте...

Ещё раз большое спасибо за обсуждение.

С уважением, Андрей Митин
ICQ 38607432
http://am.rusimport.ru
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / хитрый (ну может быть не особо :) запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]