Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5 6   вперед  Ctrl      все
 Re: Запросы на подсчет должностей  [new]
fantanol
Member

Откуда:
Сообщений: 191
Руслан Дамирович
fantanol
Что-то я запутался. Где тогда будет отниматься количество свободных должностей?

Перестань уже думать в рамках начальной задачи.
Тебе показали, как сделать то, что тебе нужно ПРАВИЛЬНО.
НеобходимоеКоличество = r.Количество,
s.ЗанятоМест,
Свободно = r.Количество - s.ЗанятоМест

Что из этого тебе непонятно?


Если бы эти примеры у меня еще работали. Я час над ними сижу и ничего не получается
15 май 17, 15:43    [20482219]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31371
fantanol
Если бы эти примеры у меня еще работали. Я час над ними сижу и ничего не получается

Правильно, у вас же много времени, вам не жалко?
Я же написал:
alexeyvg
Поверьте, если сразу делать неправильно, то это не экономит время, а отнимает его.
Зачем писать varchar(max) для идентификаторов, это что, дольше, чем написать int?

fantanol
Сообщение 8120, уровень 16, состояние 1, строка 1
Столбец "Сотрудник.id_Сотрудник" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
Добавьте в подзапросе GROUP BY id_Должность
select d.Наименование as Должность, r.Количество as НеобходимоеКоличество, s.ЗанятоМест, r.Количество - s.ЗанятоМест as Свободно
from Должность d
    left join Штатное_расписание r
        on r.id_Должность = d.id_Должность
    left join (
        select id_Должность, count(*) as ЗанятоМест
        from Сотрудник
        group by id_Должность
    ) as s on s.id_Должность = d.id_Должность
15 май 17, 16:15    [20482325]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
fantanol
Member

Откуда:
Сообщений: 191
alexeyvg
fantanol
Если бы эти примеры у меня еще работали. Я час над ними сижу и ничего не получается

Правильно, у вас же много времени, вам не жалко?
Я же написал:
alexeyvg
Поверьте, если сразу делать неправильно, то это не экономит время, а отнимает его.
Зачем писать varchar(max) для идентификаторов, это что, дольше, чем написать int?

fantanol
Сообщение 8120, уровень 16, состояние 1, строка 1
Столбец "Сотрудник.id_Сотрудник" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
Добавьте в подзапросе GROUP BY id_Должность
select d.Наименование as Должность, r.Количество as НеобходимоеКоличество, s.ЗанятоМест, r.Количество - s.ЗанятоМест as Свободно
from Должность d
    left join Штатное_расписание r
        on r.id_Должность = d.id_Должность
    left join (
        select id_Должность, count(*) as ЗанятоМест
        from Сотрудник
        group by id_Должность
    ) as s on s.id_Должность = d.id_Должность



Сначала ругалось на bigint, я переделал всё в нормальный вид.

Теперь вот это:
Сообщение 208, уровень 16, состояние 1, строка 1
Недопустимое имя объекта "Должность".
15 май 17, 16:37    [20482376]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
fantanol
Member

Откуда:
Сообщений: 191
Извиняюсь. Ошибки про должность нет, я просто не ту базу выбрал.

У меня теперь вот это

Сообщение 245, уровень 16, состояние 1, строка 1
Ошибка преобразования значения varchar "Грузчик" в тип данных int.
15 май 17, 16:38    [20482385]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
rnk
Member

Откуда:
Сообщений: 126
fantanol
Сообщение 245, уровень 16, состояние 1, строка 1
Ошибка преобразования значения varchar "Грузчик" в тип данных int.

А "Грузчик" — это сколько? 1, 2, 512, 142857?
15 май 17, 16:41    [20482392]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
fantanol
Member

Откуда:
Сообщений: 191
rnk
fantanol
Сообщение 245, уровень 16, состояние 1, строка 1
Ошибка преобразования значения varchar "Грузчик" в тип данных int.

А "Грузчик" — это сколько? 1, 2, 512, 142857?




У меня int для данных нигде не стоит,сами посмотрите


+
use Zoom


create table Расписание
(
id_Расписание int not null identity(1,1) Primary key,
id_Сотрудник varchar(50) not null,
id_Должность varchar(50) not null,	
Дата_Назначения varchar(50) not null,
Дата_Снятия varchar(50) not null,
)


create table Отдел
(
	id_Отдел int not null identity(1,1) Primary key,
	Наименование varchar(50) not null,
)



create table Штатное_расписание
(
	id_Штатное_расписание int not null identity(1,1) Primary key,
	id_Должность varchar(50) not null,		
	Количество varchar(50) not null,
)



create table Должность
(
	id_Должность int not null identity(1,1) Primary key,
	Наименование varchar(50) not null,	
)


create table Вакансии
(
	id_Вакансии int not null identity(1,1) Primary key,
	id_Должность varchar(50) not null,	
	Необходимое_количество varchar(50) not null,
	Занято_мест varchar(50) not null,
	Свободно varchar(50) not null,
)





create table Сотрудник
(
	id_Сотрудник int not null identity(1,1) Primary key,
	id_Отдел varchar(50) not null,
	id_Должность varchar(50) not null,
	Фамилия varchar(50) not null,
	Имя varchar(50) not null,
	Отчество varchar(50) not null,
	Пол varchar(50) not null,
	Дата_рождения date not null,
	Место_рождения varchar(50) not null,
	Семейное_положение varchar(50) not null,
	Домашний_адрес varchar(50) not null,
	Мобильный_телефон varchar(50) not null,
	Дата_приема date not null,	 
)


create table Военнообязанные
(
	id_Военнообязанные int not null identity(1,1) Primary key,
	Сотрудник varchar(50) not null,
	Группа_учета varchar(50) not null,
	Категория_учета varchar(50) not null,
	Состав varchar(50) not null,
	Воинское_звание varchar(50) not null,
	Годность varchar(50) not null,
	Название_военкомата varchar(50) not null,
)


create table Образование
(
	id_Образование int not null identity(1,1) Primary key,
	Сотрудник varchar(50) not null,
	Вид_образования varchar(50) not null,
	Вид_обучения varchar(50) not null,
)



create table Паспорт
(
	id_Паспорт int not null identity(1,1) Primary key,
	Сотрудник varchar(50) not null,
	Номер varchar(50) not null,
	Кем_выдан varchar(50) not null,	
	Дата_выдачи date not null,	
)




create table Семья
(
	id_Семья int not null identity(1,1) Primary key,
	Сотрудник varchar(50) not null,
	Фамилия varchar(50) not null,
	Имя varchar(50) not null,
	Отчество varchar(50) not null,
	Дата_рождения date not null,	
)

create table Аттестация
(
	id_Аттестация int not null identity(1,1) Primary key,
	Сотрудник varchar(50) not null,
	Дата date not null,	
	Решение_комиссии varchar(50) not null,
)


create table Квалификация
(
	id_Квалификация int not null identity(1,1) Primary key,
	Сотрудник varchar(50) not null,
	Дата date not null,	
	Вид_повышения_квалификации varchar(50) not null,
)



create table Отпуск 
(
	id_Отпуск int not null identity(1,1) Primary key,
	Сотрудник varchar(50) not null,
	Вид_отпуска varchar(50) not null,
	Дата_начала date,
	Дата_окончания date,
	Основание varchar(50) not null,
)
15 май 17, 16:47    [20482413]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
rnk
Member

Откуда:
Сообщений: 126
fantanol,

А зачем внешние ключи сделаны varchar?

Вот, например, в таблице Должность:
[SRC=]id_Должность int not null identity(1,1) Primary key[/SRC]

А в таблице Штатное_расписание:
id_Должность varchar(50) not null


С чего бы?
15 май 17, 16:55    [20482446]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
fantanol
Member

Откуда:
Сообщений: 191
rnk
fantanol,

А зачем внешние ключи сделаны varchar?

Вот, например, в таблице Должность:
[SRC=]id_Должность int not null identity(1,1) Primary key[/SRC]

А в таблице Штатное_расписание:
id_Должность varchar(50) not null


С чего бы?


Без понятия если честно. У меня в программе так работает и я не стал менять
15 май 17, 17:03    [20482467]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
rnk
Member

Откуда:
Сообщений: 126
fantanol
rnk
fantanol,

А зачем внешние ключи сделаны varchar?

Вот, например, в таблице Должность:
id_Должность int not null identity(1,1) Primary key


А в таблице Штатное_расписание:
id_Должность varchar(50) not null


С чего бы?


Без понятия если честно. У меня в программе так работает и я не стал менять

Похоже, где-то здесь собака и порылась. Попробуйте все поля id_*** преобразовать в int, где-нибудь да выдаст ошибку.
15 май 17, 17:11    [20482499]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
fantanol
Member

Откуда:
Сообщений: 191
rnk
fantanol,

А зачем внешние ключи сделаны varchar?

Вот, например, в таблице Должность:
[SRC=]id_Должность int not null identity(1,1) Primary key[/SRC]

А в таблице Штатное_расписание:
id_Должность varchar(50) not null


С чего бы?


Я через insert into заполняю таблицы. И если id_Должность varchar(50) not null будет Int,то я не смогу занести текстовые значения туда
15 май 17, 17:12    [20482506]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
fantanol
Member

Откуда:
Сообщений: 191
Решил проблему таким образом


SELECT d.Наименование AS Должность, r.Количество AS Необходимое_количество, s.Занято_мест, r.Количество - s.Занято_мест AS Свободно
FROM Должность d
    LEFT JOIN Штатное_расписание r
        ON r.id_Должность = d.Наименование
    LEFT JOIN (
        SELECT id_Должность, COUNT(*) AS Занято_мест
      from Сотрудник
        group by id_Должность
    ) as s on s.id_Должность = d.Наименование


ну и результат

К сообщению приложен файл. Размер - 13Kb
15 май 17, 17:29    [20482572]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
rnk
Member

Откуда:
Сообщений: 126
fantanol,

Отсюда в id_Должность и попадает "Грузчик", которого вы потом пытаетесь сопоставить с id_Должность в таблице должностей. Странно, что у вас это вообще хоть как-то работало.

SELECT INTO слишком мощное оружие, попробуйте заливать обычным INSERT ... SELECT. Ну и id_*** - только интами.
15 май 17, 17:31    [20482581]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
rnk
Member

Откуда:
Сообщений: 126
fantanol
Решил проблему таким образом


SELECT d.Наименование AS Должность, r.Количество AS Необходимое_количество, s.Занято_мест, r.Количество - s.Занято_мест AS Свободно
FROM Должность d
    LEFT JOIN Штатное_расписание r
        ON r.id_Должность = d.Наименование
    LEFT JOIN (
        SELECT id_Должность, COUNT(*) AS Занято_мест
      from Сотрудник
        group by id_Должность
    ) as s on s.id_Должность = d.Наименование


ну и результат


Ах, вот оно что. Так, конечно, будет работать, но одинаково называть разные по смыслу поля — дурной тон.
15 май 17, 17:39    [20482606]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
fantanol
Member

Откуда:
Сообщений: 191
Можете с этими задачами помочь?
нельзя удалить должность, если есть сотрудники занимающие данную должность.
нельзя ввести значения в датах отпуска, чем дата принятия на работу
15 май 17, 17:51    [20482661]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
Zim90
Guest
fantanol


SELECT isnull(d.Наименование,0) AS Должность, isnull(r.Количество, 0) AS Необходимое_количество, isnull(s.Занято_мест,0), isnull(r.Количество, 0) - isnull(s.Занято_мест,0) AS Свободно
FROM Должность d
    LEFT JOIN Штатное_расписание r
        ON r.id_Должность = d.Наименование
    LEFT JOIN (
        SELECT id_Должность, COUNT(*) AS Занято_мест
      from Сотрудник
        group by id_Должность
    ) as s on s.id_Должность = d.Наименование




А так не пробовал?
15 май 17, 17:52    [20482667]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
rnk
Member

Откуда:
Сообщений: 126
fantanol
Можете с этими задачами помочь?
нельзя удалить должность, если есть сотрудники занимающие данную должность.
нельзя ввести значения в датах отпуска, чем дата принятия на работу

Триггеры.
15 май 17, 18:03    [20482695]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
fantanol
Member

Откуда:
Сообщений: 191
Zim90

А так не пробовал?


Спасибо,так лучше.
Только почему название столбца пропало?)


rnk
fantanol
Можете с этими задачами помочь?
нельзя удалить должность, если есть сотрудники занимающие данную должность.
нельзя ввести значения в датах отпуска, чем дата принятия на работу

Триггеры.


Пример бы всего этого

К сообщению приложен файл. Размер - 13Kb
15 май 17, 18:13    [20482708]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31371
fantanol
Я через insert into заполняю таблицы. И если id_Должность varchar(50) not null будет Int,то я не смогу занести текстовые значения туда
id_Должность - это номер строки (идентификатор записи)
Туда нужно заносить число, а не строку.
15 май 17, 19:36    [20482863]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
Сид
Member

Откуда: Москва
Сообщений: 305
fantanol
Сид,

У меня не такая серьезная программа,как вы думаете) И текст задачи для меня уже сформировали. Я делаю то что уже мне задали. Осталось лишь то что я просил выше.


Вы делаете реальную программу для реального лечебного учреждения, или это лабораторка институтская по предмету "Базы данных"?

Если реальная программа, то, поверьте, всё гораздо серьёзнее, чем ВЫ думаете. А то, что некто сформулировал в тексте задачи, может тоже сильно отличаться от реальности, ибо задачеписатель скорее всего сам впервые столкнулся с предметной областью.
Здесь Вам пытаются рассказать одну простую вещь: что изначально всё неправильно, и нужно вникнуть, выбросить существующую структуру и переделать как надо, а не как попало, чтобы потом не городить бесконечный говнокод на говнокоде, когда окажется, что всё несколько сложнее, чем ожидалось. Даю 256% вероятности, что так оно и будет, при том весьма быстро. И угадайте, кого назначат крайним и заставят круглосуточно ломать мозг, чтобы по-быстренькому всё переделать в круглосуточном режиме без выходных :)

А если это институтская лабораторка, лучше попросите помощи у соседа-отличника)))
16 май 17, 00:47    [20483284]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
fantanol
Member

Откуда:
Сообщений: 191
Сид
fantanol
Сид,

У меня не такая серьезная программа,как вы думаете) И текст задачи для меня уже сформировали. Я делаю то что уже мне задали. Осталось лишь то что я просил выше.


Вы делаете реальную программу для реального лечебного учреждения, или это лабораторка институтская по предмету "Базы данных"?

Если реальная программа, то, поверьте, всё гораздо серьёзнее, чем ВЫ думаете. А то, что некто сформулировал в тексте задачи, может тоже сильно отличаться от реальности, ибо задачеписатель скорее всего сам впервые столкнулся с предметной областью.
Здесь Вам пытаются рассказать одну простую вещь: что изначально всё неправильно, и нужно вникнуть, выбросить существующую структуру и переделать как надо, а не как попало, чтобы потом не городить бесконечный говнокод на говнокоде, когда окажется, что всё несколько сложнее, чем ожидалось. Даю 256% вероятности, что так оно и будет, при том весьма быстро. И угадайте, кого назначат крайним и заставят круглосуточно ломать мозг, чтобы по-быстренькому всё переделать в круглосуточном режиме без выходных :)

А если это институтская лабораторка, лучше попросите помощи у соседа-отличника)))

А потом на защите диплома тебя посылают за то что ты отошел от задания))
16 май 17, 00:57    [20483291]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
Сид
Member

Откуда: Москва
Сообщений: 305
fantanol
Сид
пропущено...


Вы делаете реальную программу для реального лечебного учреждения, или это лабораторка институтская по предмету "Базы данных"?

Если реальная программа, то, поверьте, всё гораздо серьёзнее, чем ВЫ думаете. А то, что некто сформулировал в тексте задачи, может тоже сильно отличаться от реальности, ибо задачеписатель скорее всего сам впервые столкнулся с предметной областью.
Здесь Вам пытаются рассказать одну простую вещь: что изначально всё неправильно, и нужно вникнуть, выбросить существующую структуру и переделать как надо, а не как попало, чтобы потом не городить бесконечный говнокод на говнокоде, когда окажется, что всё несколько сложнее, чем ожидалось. Даю 256% вероятности, что так оно и будет, при том весьма быстро. И угадайте, кого назначат крайним и заставят круглосуточно ломать мозг, чтобы по-быстренькому всё переделать в круглосуточном режиме без выходных :)

А если это институтская лабораторка, лучше попросите помощи у соседа-отличника)))

А потом на защите диплома тебя посылают за то что ты отошел от задания))


Ага, значит таки институт, просто промахнулся с видом работы))) считаем, что повезло. Но лучше с науч.руком обсудить детали, т.к. выше уже давали дельные советы по структуре (то, на что я до этого давал намёки). И то, что мы все пытаемся растолковать, основано не на догадках, а на реальной работе с отделами кадров в том или ином виде. Не знаю, как другие участники, но я к тому же ещё и в больнице с этим дело имею, т.е. как раз живой человек по теме диплома))) И вместо того, чтобы делать "тупо по заданию", можно вывернуть всё как рац.предложение по улучшению задания, что может дать +1 балл непосредственно в диплом. А ещё это +1 маленький шажок от тупо-кодера-по-заданию к разработчику. Если, конечно, планируете далее работать по специальности)))
16 май 17, 01:10    [20483298]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
fantanol
Member

Откуда:
Сообщений: 191
Сид
fantanol
пропущено...

А потом на защите диплома тебя посылают за то что ты отошел от задания))


Ага, значит таки институт, просто промахнулся с видом работы))) считаем, что повезло. Но лучше с науч.руком обсудить детали, т.к. выше уже давали дельные советы по структуре (то, на что я до этого давал намёки). И то, что мы все пытаемся растолковать, основано не на догадках, а на реальной работе с отделами кадров в том или ином виде. Не знаю, как другие участники, но я к тому же ещё и в больнице с этим дело имею, т.е. как раз живой человек по теме диплома))) И вместо того, чтобы делать "тупо по заданию", можно вывернуть всё как рац.предложение по улучшению задания, что может дать +1 балл непосредственно в диплом. А ещё это +1 маленький шажок от тупо-кодера-по-заданию к разработчику. Если, конечно, планируете далее работать по специальности)))

Скрины с больницей для примеры были) У меня хоть и отдел кадров,но не больница)
Про улучшение задания я запомню. Спасибо)
16 май 17, 01:27    [20483304]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31371
fantanol
А потом на защите диплома тебя посылают за то что ты отошел от задания))
Так про задание вы не рассказываете.

Что, в задании написано делать идентификатор типа varchar(max)?
16 май 17, 08:16    [20483440]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
fantanol
Member

Откуда:
Сообщений: 191
alexeyvg
fantanol
А потом на защите диплома тебя посылают за то что ты отошел от задания))
Так про задание вы не рассказываете.

Что, в задании написано делать идентификатор типа varchar(max)?


В заданиях такого не пишут) Я сам решил так сделать
16 май 17, 10:08    [20483781]     Ответить | Цитировать Сообщить модератору
 Re: Запросы на подсчет должностей  [new]
iiyama
Member

Откуда:
Сообщений: 642
fantanol,
на защите 100% вопрос по FK
create table Расписание(id_Сотрудник varchar(max) not null, id_Должность varchar(max) not null ...
и
create table Должность(id_Должность int not null identity(1,1) Primary key,Наименование varchar(50) not null ...

PS. Только не пишите что Расписание.id_Должность = Должность.Наименование , если конечно это не кафедра распила
PPS. Постройте связи между таблицами и диаграмму, повесьте на стену перед собой, это поможет писать запросы

чисто ИМХО
16 май 17, 11:11    [20484055]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5 6   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить