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

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

  Все выпуски  

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


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

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

Выпуск № 85
от 01.05.2006, 13:05

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


Вопрос № 41247: Здравствуйте. Есть набор атрибутов по учету работы предприятия: 1.Название изделия 2. № чертежа изделия 3.Количество производимых изделий 4.№ цеха, производящего изделие 5.Дата начала производства партии изделий 6.Дата заверше...
Вопрос № 41284: У меня проблемка одна, вот нужно написать запрос По выбранной стране найти объем продаж по годам. Запрос написан, но дело в том, что поле SaleDate это дата(дд.мм.гггг), а мну нужно как то просуммировать по годма объем продаж, а не по датам как у ...
Вопрос № 41301: Ув.эксперты! Подскажите пожалуйста,почему то в SQL Server Enterprise Manager после перезагрузки сервера SQL Server Agent автоматически не запускается?И что надо сделать чтобы это исправить? Заранее благодарен всем ответившим...

Вопрос № 41.247
Здравствуйте. Есть набор атрибутов по учету работы предприятия:
1.Название изделия
2. № чертежа изделия
3.Количество производимых изделий
4.№ цеха, производящего изделие
5.Дата начала производства партии изделий
6.Дата завершения производства партии изделий
7.Название материала, необходимого для производства изделия
8.Количество материала
9.Название инструмента, используемого при производстве изделия
10. Количество инструмента
11.Цена изделия
Вот разбиение на таблички:
1) -Название
-№ чертежа
-Цена
2) -Код партии изделий
-количество изделий
-№ чертежа
3) -код партии
-№ цеха
-дата начала
-дата конца
4) -название инструмента
-количество инструмента
-№ чертежа
5) -название материала
-количество материала
-№ чертежа
Что скажите? Нормальное разбиение? или не очень удобное, мне не очень нравятся
таблички про инструмент и материал, но куда тогда деть эти атрибуты? Что посоветуете,
и вообще ваше мнение.
Отправлен: 25.04.2006, 13:19
Вопрос задал: XreXz (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Филатов Евгений Геннадьевич
Здравствуйте, XreXz!

Примерная структура для MS ACCESS, для других СУБД аналогично:

ZAKAZ - список заказанных партий
Kod long (Код заказа)
Zeh long (Код цеха)
Nac smalldatetime (Дата начала в виде 1.1.2000)
Kon smalldatetime (Дата окончания в виде 31.1.2000)

PARTIJA - состав заказанных партий
Kod long (Код партии)
Chert long (код чертежа)
Kol long (Количество единиц указанного чертежа в партии)

CHERT - наименование чертежа
Kod long (код чертежа)
Naim String(30) default '' (наименование чертежа)
Price long (стоимость изготовления чертежа в копейках, хранить числа лучше в целых полях, в программе делить, например на 100)

MATERIAL - справочник материалов
Kod long (код материала)
Naim String(30) default '' (наименование материала)

INSTRUMENT - справочник инструментов
Kod long (код инструмента)
Naim String(30) default '' (наименование инструмента)

ZATR - расход материла на единицу чертежа
Chert long (код чертежа)
Mat long (код материала)
Kol long (количество затрат материала)

RASH - расход инструмента на единицу чертежа
Chert long (код чертежа)
Instr long (код инструмента)
Kol long (количество затрат инструмента)

Отдельно ведется справочник материалов и инструментов.
Программно следить за уникальностью кодов партий, чертежей и др. (поле KOD).
Как я понимаю, возможно частичное использование инструмента в чертеже (в таблицах не отражено, но можно хранить количество в десять раз больше), например один резец используется для производства двух единиц чертежа, в таблице отображать 5 (на самом деле 0.5, программа делит на 10).
Можно вести отдельно справочник цехов.

Примеры запросов:
1. Список заказанных партий
select * from Zakaz z inner join Partija p on p.kod=z.kod
2. Список содержимого партии чертежей
select * from Partija p inner join Chert c on c.kod=p.chert
3. Затраты на производство единицы чертежа
select * from (((Chert c inner join Zatr z on z.chert=c.kod) inner join material m on m.kod=z.mat) inner join rash r on r.chert=c.kod) inner join Instrument i on i.kod=r.instr
4. Сводный запрос покажет список заказов с содержимым и затратами
select * from (((((Zakaz z inner join Partija p on p.kod=z.kod) inner join Chert c on c.kod=p.chert) inner join Zatr z1 on z1.chert=c.kod) inner join material m on m.kod=z1.mat) inner join rash r on r.chert=c.kod) inner join Instrument i on i.kod=r.instr
Ответ отправил: Филатов Евгений Геннадьевич (статус: 2-ой класс)
Ответ отправлен: 25.04.2006, 22:01
Оценка за ответ: 5
Комментарий оценки:
спасибо за развернутый и дельный ответ

Отвечает: Игорь Елизаров
Здравствуйте, XreXz!
таблички конечно сделаны не очень..
во- первых, попробуй выделить справочники, то есть те элементы, которые часто используются и могут использоваться в разных местах, но относительно редко меняются
справочники имеют как минимум три поля
- код
- наименование
- примечание
- (можно еще кучу атрибутов для удобства)
По вашей схеме должны быть справочники
- изделий
- инструментов
- цехов
таблица соответствия инструментов и изделий иммеет примерно следующую структуру
- код изделия
- № чертежа
- код инструмента
- количество инструмента

то есть для одного изделия может быть несколько инструментов

ну а дальше уже проще
таблица производство изделия
- код цеха
- код изделия
- цена
- размер партии
- дата начала
- дата окончания

Ответ отправил: Игорь Елизаров (статус: 3-ий класс)
Ответ отправлен: 26.04.2006, 00:58
Оценка за ответ: 5
Комментарий оценки:
спасибо за дельный совет


Вопрос № 41.284
У меня проблемка одна, вот нужно написать запрос
По выбранной стране найти объем продаж по годам. Запрос написан, но дело в том, что поле SaleDate это дата(дд.мм.гггг), а мну нужно как то просуммировать по годма объем продаж, а не по датам как у меня получается.
Sel -это выбранная страна
БД аксесовкая dbdemos, запрос написан в делфи.
Помогите, запрос прилогаю

Приложение:

Отправлен: 25.04.2006, 22:44
Вопрос задала: Talya (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Филатов Евгений Геннадьевич
Здравствуйте, Talya!
В запросе замените Orders.SaleDate на Year(Orders.SaleDate).
Сгруппирует и выведет сводный запрос по году продаж.
Точно также можно заменить на Year(Orders.SaleDate),Month(Orders.SaleDate) (по году и месяцу).
Если замените на Year(Orders.SaleDate),Month(Orders.SaleDate),Day(Orders.SaleDate) получится аналог Вашего запроса:
'SELECT Day(Orders.SaleDate) as den,Month(Orders.SaleDate) as Mes,Year(Orders.SaleDate) as God, SUM(Orders.ItemsTotal) ' +
'FROM Customer, Orders ' +
'WHERE Customer.CustNo = Orders.CustNo ' +
'And Customer.Country = ' + Sel +
' GROUP BY Year(Orders.SaleDate),Month(Orders.SaleDate),Day(Orders.SaleDate)'
Ответ отправил: Филатов Евгений Геннадьевич (статус: 2-ой класс)
Ответ отправлен: 25.04.2006, 23:09
Оценка за ответ: 3
Комментарий оценки:
нет, увы и ах такое не воспиринимается... сама пробовала ни раз такую вещь, не выходит

Отвечает: Игорь Елизаров
Здравствуйте, Talya!
дело в том, что суммирование идет по тем полям, которые указаны в группировке.
поля дат в этом случае лучше не указывать, так как просуммирует по каждой дате.
можно попробовать сделать через вложенный запрос, например так

'SELECT year1, SUM(Orders.ItemsTotal) ' +
'FROM
'(select year(saledate) as year1, itemtotal from Customer, Orders ' +
'WHERE Customer.CustNo = Orders.CustNo ' +
'And Customer.Country = ' + Sel + ') t'+

' GROUP BY year1'

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

запрос для базы SQL выглядел бы так:

SELECT year1, SUM(ItemsTotal)
FROM
(select year(orders.saledate) as year1, orders.itemtotal from Customer
inner join Orders on Customer.CustNo = Orders.CustNo
WHERE Customer.Country = @Sel ) t

GROUP BY year1
(просто немного по другому описана связь между таблицами)
Ответ отправил: Игорь Елизаров (статус: 3-ий класс)
Ответ отправлен: 26.04.2006, 00:42

Отвечает: Kazakh
Здравствуйте, Talya!
Вам надо группировать по годам. Для этого надо выделить год изи даты.Например, используя стандартную Аксесовскую функцию Year().

SELECT year(Orders.Saledate), SUM(Orders.ItemsTotal)
FROM Customer, Orders
WHERE Customer.CustNo = Orders.CustNo
And Customer.Country = 'US'
GROUP BY Year(Orders.SaleDate)

ИМХО, Есть и другие способы, но этот оптимальный.
---------
Если собеседник затрудняется ответить, значит, вопрос поставлен правильно.
Ответ отправил: Kazakh (статус: 6-ой класс)
Ответ отправлен: 26.04.2006, 07:09
Оценка за ответ: 3
Комментарий оценки:
ну вот не работает такой способ!!!!
уже пробовала:(


Вопрос № 41.301
Ув.эксперты!
Подскажите пожалуйста,почему то в SQL Server Enterprise Manager
после перезагрузки сервера SQL Server Agent автоматически не запускается?И что надо сделать чтобы это исправить?
Заранее благодарен всем ответившим
Отправлен: 26.04.2006, 06:34
Вопрос задал: AL1 (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Филатов Евгений Геннадьевич
Здравствуйте, AL1!
Действительно, при остановке сервера, агент тоже автоматически останавливается. Другое дело, что если Вы вручную перезапустили сервер, почему бы заодно и не запустить агента?

Для запуска и перезапуска служб можно использовать командную строку, например файл Server_start.bat может быть следующего содержания:

rem сначала надо остановить все службы, которые запущены
net stop SQLServerAgent
net stop mssqlserver
rem запускаем службы
net start mssqlserver
net start SQLServerAgent

Для остановки служб можно использовать командную строку, например файл Server_stop.bat может быть следующего содержания:

rem останавливаем все службы, которые запущены
net stop SQLServerAgent
net stop mssqlserver

Даже в случае, если служба не запущена, а Вы попытаетесь ее остановить, то просто выскочит сообщение типа
Служба "MSSQLSERVER" не запущена или
Служба "SQLSERVERAGENT" не запущена
и все будет продолжаться дальше.

По идее, запуск должен производиться от имени администратора, у меня так, под другими пользователями не проверял.

С уважением.
Ответ отправил: Филатов Евгений Геннадьевич (статус: 2-ой класс)
Ответ отправлен: 28.04.2006, 12:35
Оценка за ответ: 5


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

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

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

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

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


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


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.31 от 28.04.2006
Яндекс Rambler's Top100

В избранное