Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RusFAQ.ru: Базы данных SQL


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Базы данных SQL

Выпуск № 262
от 12.06.2007, 03:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 438, Экспертов: 60
В номере:Вопросов: 1, Ответов: 3


Вопрос № 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)))

DECLARE @Date Char(10), @NDate Int, @CrTable NChar(4000), @CName NChar(255) --нужные нам переменные

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 (в особенности объектный) и по этому к вам обратился(в принципе я такой ответ и ждал, где то читал что можно создавать временные таблицы с помощью процедур и обращаться к ним как к обычной таблице, но конкретно литературу не нашел, да раньше и не сталкивался с этим). Если вам не трудно не смогли бы вы мне по внутренней почте прислать что - нибудь по этой теме или ссылочку дать. Надеюсь наше с вами сотрудничество будет благотворным!!!!:)


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.52 от 02.05.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное