Вопрос № 90366: Здравствуйте Эксперты!!!
У меня к вам такие вопросы:
1) Помогите написать процедуру!!!
Имеються таблицы:
«товары» (№товара, название);
«дата»(№даты, дата);
«покупка»(№, №товара, №даты, количество).
Как сделать так чт...
Вопрос № 90.366
Здравствуйте Эксперты!!!
У меня к вам такие вопросы:
1) Помогите написать процедуру!!!
Имеються таблицы:
«товары» (№товара, название);
«дата»(№даты, дата);
«покупка»(№, №товара, №даты, количество).
Как сделать так чтобы в виде названия строк выводилось названия товаров, в виде названия столбцов даты, а на пересечении этих значений – количество? Надеюсь вы поняли что я имею ввиду (я думаю это возможно реализовать с помощью хранимой процедуры)!!!!
Например
10.02 | 11.20 | 12.02
хлеб 10 | 1 | 5
чай 5 | 4 | 1
Надеюсь наглядно получилось.
2) Помогите написать триггер!!!
Допустим что те же таблицы да + ещё таблица «поступление»(№, №товара, название)
Нужен триггер который добавляет автоматически данные(№товара, название) в «товары» при внесении данных в «поступление».
p.s. Пользуюсь MS SQL server 2000.
Заранее благодарю всех.
Надеюсь вы мне поможите!
Отправлен: 07.06.2007, 03:13
Вопрос задал: Ram (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Андрей Тимофеев
Здравствуйте, Ram!
1. Я думаю средствами sql у вас не получится это построить. Рекомендую использовать сводные таблицы в excel - там у вас это все легко получится.
Вы можете получать данные из sql и на основании их строить сводную таблицу.
2.по тригерам - извините...
Удачи.
Ответ отправил: Андрей Тимофеев (статус: 3-ий класс)
Ответ отправлен: 07.06.2007, 10:32 Оценка за ответ: 4 Комментарий оценки: Извените если что за оценку но посмотрите следующие пример. Было бы интересно посмотреть то что вы предлагаете(сводные таблицы в excel ) и узнать как вы это делаету(я в первый раз встречаюсь с этим). Можно ли примерчик?
Отвечает: Виктор Пырлик
Здравствуйте, Ram!
По первому вопросу – это n-мерные кубы, анализ данных. В SQL нет средств для их реализации. Как правило, используются внешние средства визуализации. Например компоненты Decision Cube в частности TDecisionGraph для Delphi/C++Builder. Или в иных средах построения отчетов, в простейшем случае действительно лучше взять Excel.
По второму вопросу – не совсем понял, что вам нужно – зачем дублирование («товары» и «поступление» идентичные)? Но в любом случае, можете использовать триггер на вставку
CREATE TRIGGER Tr_PrihodIns
ON поступление
FOR INSERT
AS
insert into товары (num_tovar,name_tovar)
values (1,'пирожки')
--------- Надо пребывать господа, пребывать! Иначе ничего не получится!
Ответ отправил: Виктор Пырлик (статус: 3-ий класс)
Ответ отправлен: 07.06.2007, 10:55 Оценка за ответ: 5 Комментарий оценки: На счет Decision Cube я думал, но есть одно "но" - оно по-моему не взаимодействует с ADOConnection и вообще с Ado, а мне нужно чтобы работало. По этому я и решил создать сранимую процедуру. Но все равно спасибо за ответ!
Отвечает: Sergey T
Здравствуйте, Ram!
По второму уже ответили - да и триггер у вас простейший - сами поситаете BOL сделаете как надо.
По первому вопросу примечание небольшое - можно конечно и по другому реализовать - через переменную типа Table, но тогда надо практически все выносить в переменю NChar - это конечно более верно на мой взгляд, но более муторно.
В данном же примере процедура создаст таблицу ITOG.
Можно не возвращать данных - а просто сделать выборку из таблицы. Тогда курсор последний нужно убрать.
Еще правилнее сделать - это передавать параметром имя таблицы куда вернуть результат. Это ужа сами сумеете я думаю, а пока таблица ITOG будет оставаться и удалять ее вам нужно самому.
Процедура:
CREATE PROCEDURE Sergey.GetProdDate
@DateStart DateTime, --дата начала вывода данных по покупкам
@DateEnd DateTime --дата конца вывода данных по покупкам (включительно)
AS
-- обнуление времени в передаваемых датах
SELECT @DateStart=CONVERT(DateTime, CONVERT(Int, @DateStart)),
@DateEnd=DATEADD(dd, 1, CONVERT(DateTime, CONVERT(Int, @DateEnd)))
IF OBJECT_ID('ITOG') IS NOT NULL DROP TABLE ITOG -- проверка нет ли уже такой таблицы, и если есть - то удаляем её
SET @CrTable='
CREATE TABLE ITOG(
NТовара Int,
Товар Char(255)'
DECLARE CrTable CURSOR LOCAL FAST_FORWARD --курсор для создания структуры таблицы
FOR
SELECT CONVERT(Char(10), Дата, 104) FROM Дата WHERE Дата>=@DateStart AND Дата<@DateEnd
OPEN CrTable
FETCH NEXT FROM CrTable INTO @Date
WHILE @@FETCH_STATUS=0
BEGIN
SET @CrTable=RTRIM(@CrTable)+',
['+@Date+'] Int'
FETCH NEXT FROM CrTable INTO @Date
END
CLOSE CrTable
DEALLOCATE CrTable
SET @CrTable=RTRIM(@CrTable)+')'
EXEC (@CrTable) --создание таблицы
-- вставка ассортимента
INSERT ITOG(NТовара, Товар)
SELECT DISTINCT t.NТовара, t.Название
FROM Покупка p INNER JOIN Товары t ON t.NТовара=p.NТовара
WHERE p.NДаты IN (SELECT NДаты FROM Дата WHERE Дата>=@DateStart AND Дата<@DateEnd)
DECLARE UpdItog CURSOR LOCAL FAST_FORWARD -- курсор для обновление итогов по покупкам в разрезе товара
FOR
SELECT NДаты, CONVERT(Char(10), Дата, 104) FROM Дата WHERE Дата>=@DateStart AND Дата<@DateEnd
OPEN UpdItog
FETCH NEXT FROM UpdItog INTO @NDate, @Date
WHILE @@FETCH_STATUS=0
BEGIN
SET @CrTable=('UPDATE i SET i.['+@Date+']=p.Количество
FROM ITOG i, Покупка p WHERE p.NДаты='+RTRIM(CONVERT(Char(255), @NDate))+' AND p.NТовара=i.NТовара')
EXEC (@CrTable)
FETCH NEXT FROM UpdItog INTO @NDate, @Date
END
CLOSE UpdItog
DEALLOCATE UpdItog
SET @CrTable='SELECT Товар'
DECLARE SelItog CURSOR LOCAL FAST_FORWARD --курсор для подготовки запроса по возврату результата
FOR
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='ITOG' AND ORDINAL_POSITION>2
OPEN SelItog
FETCH NEXT FROM SelItog INTO @CName
WHILE @@FETCH_STATUS=0
BEGIN
SET @CrTable=RTRIM(@CrTable)+', ['+RTRIM(@CName)+']'
FETCH NEXT FROM SelItog INTO @CName
END
CLOSE SelItog
DEALLOCATE SelItog
SET @CrTable=RTRIM(@CrTable)+' FROM ITOG ORDER BY 1'
EXEC (@CrTable) -- собственно результат
GO
Так что учите SQL господа. У него весьма широкие возможности :)
И оцените пожалуйста ответ :)
Удачи.
Ответ отправил: Sergey T (статус: 1-ый класс)
Ответ отправлен: 07.06.2007, 13:31 Оценка за ответ: 5 Комментарий оценки: Спасибо, достаточно полный ответ. Я не достаточно хорошо знаю SQL (в особенности объектный) и по этому к вам обратился(в принципе я такой ответ и ждал, где то читал что можно создавать временные таблицы с помощью процедур и обращаться к ним как к обычной таблице, но конкретно литературу не нашел, да раньше и не сталкивался с этим). Если вам не трудно не смогли
бы вы мне по внутренней почте прислать что - нибудь по этой теме или ссылочку дать. Надеюсь наше с вами сотрудничество будет благотворным!!!!:)