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

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

  Все выпуски  

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


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

Лучшие эксперты в разделе

solowey
Статус: Практикант
Рейтинг: 359
∙ повысить рейтинг »
Megaloman
Статус: Академик
Рейтинг: 125
∙ повысить рейтинг »
SAW
Статус: 7-й класс
Рейтинг: 28
∙ повысить рейтинг »

∙ Базы данных

Номер выпуска:537
Дата выхода:26.06.2019, 19:15
Администратор рассылки:Коцюрбенко Алексей Владимирович (Модератор)
Подписчиков / экспертов:20 / 16
Вопросов / ответов:3 / 13

Консультация # 90366: Здравствуйте Эксперты!!! У меня к вам такие вопросы: 1) Помогите написать процедуру!!! Имеються таблицы: «товары» (№товара, название); «дата»(№даты, дата); «покупка»(№, №товара, №даты, количество). Как сделать так чтобы в виде названия строк выводилось названия товаров, в виде названия столбцов даты, а на пересечен...
Консультация # 108399: вопрос по access: есть таблица покупок, где на дату приходиться больше одной покупки. нужно посчитать количество дней, в которых были совершены покупки. Запрос типа: select count (distinct Покупки.Дата) from Покупки; distinctrow тоже не отрабатывает) каков правильный синтаксис написания подобного рода запросов? Заранее...
Консультация # 73486: Уважаемые эксперты у меня к вам вопрос. Можно ли в ОДНОЙ БД обеденить две таблицы в запросе? Имя таблиц и имена полей в них взяты с потолка. Тоесть tbl1 и tbl2 в tbl1 есть поля event, perl, els в tbl2 есть поля asin, lone, love можно ли эти две таблицы обеденить запросом where tbl1.perl=tbl2.asin ?...

Консультация # 90366:

Здравствуйте Эксперты!!!
У меня к вам такие вопросы:
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
Страница онлайн-консультации »


Консультирует Андрей Тимофеев:

Здравствуйте, Ram!
1. Я думаю средствами sql у вас не получится это построить. Рекомендую использовать сводные таблицы в excel - там у вас это все легко получится.
Вы можете получать данные из sql и на основании их строить сводную таблицу.
2.по тригерам - извините...
Удачи.

Консультировал: Андрей Тимофеев
Дата отправки: 07.06.2007, 10:32
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Виктор Пырлик:

Здравствуйте, 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,\'пирожки\')

Консультировал: Виктор Пырлик
Дата отправки: 07.06.2007, 10:55
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует 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
Дата отправки: 07.06.2007, 13:31
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 108399:

вопрос по access: есть таблица покупок, где на дату приходиться больше одной покупки. нужно посчитать количество дней, в которых были совершены покупки. Запрос типа:

select count (distinct Покупки.Дата)
from Покупки;

distinctrow тоже не отрабатывает)
каков правильный синтаксис написания подобного рода запросов?
Заранее, спасибо

Дата отправки: 07.11.2007, 13:28
Вопрос задал: Aikijin
Всего ответов: 5
Страница онлайн-консультации »


Консультирует Некто:

Здравствуйте, Aikijin!
Попробуйте так:

select count (*) from (select distinct Дата from Покупки)

Консультировал: Некто
Дата отправки: 07.11.2007, 13:50
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Dubrovin:

Здравствуйте, Aikijin!
select Покупки.Дата, count(*)
from Покупки
group by Покупки.Дата

Консультировал: Dubrovin
Дата отправки: 07.11.2007, 15:36
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Nomadfromx2007:

Здравствуйте, Aikijin!
Странно, почему у Вас не отработал запрос select count (distinct Покупки.Дата) from Покупки.
Скорее всего, это просто не полный запрос, который Вы используете в реальном коде.
Смотрите приложение, все верно!

Приложение:

Консультировал: Nomadfromx2007
Дата отправки: 08.11.2007, 03:04
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Челноков Виктор Альбертович:

Здравствуйте, Aikijin!
Попробуйте следующее
select count(s.дата)
from (SELECT дата
FROM покупки
GROUP BY дата) as s
вначале группируем по датам , а потом определяем кол-во дней

Консультировал: Челноков Виктор Альбертович
Дата отправки: 08.11.2007, 08:48
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Титов Михаил Анатольевич:

Здравствуйте, Aikijin!

Access SQL не поддерживает distinct для аргументов агрегатных функций. А вот в
Transact-SQL (MS SQL Server) Вы вполне могли бы написать

select count (distinct Покупки.Дата)
from Покупки

В Access Вам поможет

select count (*)
from (select distinct Покупки.Дата from Покупки) AS A;

Консультировал: Титов Михаил Анатольевич
Дата отправки: 09.11.2007, 03:54
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 73486:

Уважаемые эксперты у меня к вам вопрос. Можно ли в ОДНОЙ БД обеденить две таблицы в запросе?
Имя таблиц и имена полей в них взяты с потолка.
Тоесть
tbl1 и tbl2
в tbl1 есть поля event, perl, els
в tbl2 есть поля asin, lone, love
можно ли эти две таблицы обеденить
запросом where tbl1.perl=tbl2.asin

?

Дата отправки: 31.01.2007, 16:42
Вопрос задал: Чинга
Всего ответов: 5
Страница онлайн-консультации »


Консультирует Архангельский Андрей Германови:

Здравствуйте, Чинга!

Нет проблем

Select t1.event, t1.els,t2.lone,t2.love
from tbl1 as t1, tbl2 as t2
where t1.perl=t2.asin

Возможны и более сложные объединения

Консультировал: Архангельский Андрей Германови
Дата отправки: 31.01.2007, 16:49
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует ~Steep~:

Здравствуйте, Чинга!

Можно, но необходимо чтобы у каждой таблицы были уникальные ключи
т.е. например tbl1.ID1, tbl2.ID2
Пример выборки некоторых столбцов из 2-х таблиц:

Select tbl1.event,
tbl1.els,
tbl2.asin,
tbl2.lone
From tbl1, tbl2
where tbl1.ID1=tbl2.ID2

или всех значений:

select * from tbl1, tbl2
where tbl1.ID1=tbl2.ID2

Консультировал: ~Steep~
Дата отправки: 31.01.2007, 17:03
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Mefisto:

Здравствуйте, Чинга!
Конечно можно:
SELECT * FROM tbl1,tbl2 WHERE tbl1.perl=tbl2.asin

Выведутся поля event, perl, els, asin, lone, love

Возможно я не совсем прав, там скорее всего надо через JOIN это делать.

Консультировал: Mefisto
Дата отправки: 31.01.2007, 17:17
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Базанов Иван Александрович:

Здравствуйте, Чинга!
Да. Например так:
SELECT tbl1.*, tbl2.*
FROM tbl1, tbl2
WHERE tbl1.perl=tbl2.asin
Или так
SELECT tbl1.*, tbl2.*
FROM tbl1
JOIN tbl2 ON tbl1.perl=tbl2.asin
Во многих случаях это одно и тоже...

Консультировал: Базанов Иван Александрович
Дата отправки: 31.01.2007, 18:02
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Grigory:

Здравствуйте, Чинга!
А что мешает-то? Объединяйте себе на здоровье smile Для того таблицы и создаются, чтоб их объединять (разумеется, в этом должен быть смысл :))

Консультировал: Grigory
Дата отправки: 31.01.2007, 18:11
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное