Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Присоединение одной таблицы по нескольким полям  [new]
IceMystic
Member

Откуда:
Сообщений: 13
Суть вот в чем:
имеется таблица "Табель работ автомобилей"
В которой есть кроме всего прочего 31 поле со ссылками на другую таблицу (состояние автомобилей (в работе/ТО/Нет водителя/Ремонт и прочее)).
Возникла необходимость отчета за несколько месяцев по каждому автомобилю с количеством дней (по месяцам) с каждым статусом пример таблицы приложен.
Вопрос: как зацепить таблицу состояний к 31ому полю более гуманно, чем 31 раз использовать Union ?

К сообщению приложен файл. Размер - 4Kb
28 апр 19, 11:16    [21873634]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
aleks222
Member

Откуда:
Сообщений: 985
Гораздо гуманнее использовать 31 join.
28 апр 19, 11:33    [21873641]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
IceMystic
Member

Откуда:
Сообщений: 13
aleks222
Гораздо гуманнее использовать 31 join.

Join не подходит, потому что мне нужно добавить не ещё одно поле, а ещё одно значение уже существующего поля.
Мне же в конце нужна сводная таблица с количеством дней по каждому статусу, а не куча полей с повторяющимися статусами.
28 апр 19, 11:37    [21873642]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
IceMystic
Member

Откуда:
Сообщений: 13
IceMystic
Суть вот в чем:
имеется таблица "Табель работ автомобилей"
В которой есть кроме всего прочего 31 поле со ссылками на другую таблицу (состояние автомобилей (в работе/ТО/Нет водителя/Ремонт и прочее)).
Возникла необходимость отчета за несколько месяцев по каждому автомобилю с количеством дней (по месяцам) с каждым статусом пример таблицы приложен.
Вопрос: как зацепить таблицу состояний к 31ому полю более гуманно, чем 31 раз использовать Union ?

Сам дурак, фигню написал)
Хотел написать Apply, а написал Union :(
28 апр 19, 11:39    [21873645]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
IceMystic
Member

Откуда:
Сообщений: 13
IceMystic
IceMystic
Суть вот в чем:
имеется таблица "Табель работ автомобилей"
В которой есть кроме всего прочего 31 поле со ссылками на другую таблицу (состояние автомобилей (в работе/ТО/Нет водителя/Ремонт и прочее)).
Возникла необходимость отчета за несколько месяцев по каждому автомобилю с количеством дней (по месяцам) с каждым статусом пример таблицы приложен.
Вопрос: как зацепить таблицу состояний к 31ому полю более гуманно, чем 31 раз использовать Union ?

Сам дурак, фигню написал)
Хотел написать Apply, а написал Union :(


А не, я всё правильно напиасал :)
Чет уже голова совсем не соображает :)
28 апр 19, 11:43    [21873647]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
982183
Member

Откуда: VL
Сообщений: 3352
Для ответа требуются:
1. Структура исходных таблиц.
2. Структура результирующей таблицы.
28 апр 19, 12:02    [21873653]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
IceMystic
Member

Откуда:
Сообщений: 13
982183
Для ответа требуются:
1. Структура исходных таблиц.
2. Структура результирующей таблицы.

Какую информацию Вы подразумеваете под структурой таблицы?
28 апр 19, 12:07    [21873654]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
982183
Member

Откуда: VL
Сообщений: 3352
Вы не знаете что такое таблицы или что такие их структура?
28 апр 19, 12:19    [21873657]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
IceMystic
Member

Откуда:
Сообщений: 13
982183
Вы не знаете что такое таблицы или что такие их структура?

Я не знаю, что именно Вам нужно под этой информацией...
Если описание полей таблиц, то их там больше 500
28 апр 19, 13:41    [21873692]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
982183
Member

Откуда: VL
Сообщений: 3352
Вам нужен некий отчет.
Этот отчет делается на основании некой таблицы. (Которая имеет некую структуру)
Эта таблица формируется из других таблиц (имеющих свою структуру)
Достаточно описать поля, значимые для отчета и/или имеющие значения для связи таблиц.
28 апр 19, 14:28    [21873699]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2199
IceMystic
Суть вот в чем:
имеется таблица "Табель работ автомобилей"
В которой есть кроме всего прочего 31 поле со ссылками на другую таблицу (состояние автомобилей (в работе/ТО/Нет водителя/Ремонт и прочее)).
Возникла необходимость отчета за несколько месяцев по каждому автомобилю с количеством дней (по месяцам) с каждым статусом пример таблицы приложен.
Вопрос: как зацепить таблицу состояний к 31ому полю более гуманно, чем 31 раз использовать Union ?

Я правильно понимаю - у вас в таблице отдельные поля для января, февраля и т.д.? Или это вы отчет такой сделали?

Если отдельные поля - то ответ очень простой - нанять специалиста.
28 апр 19, 14:29    [21873702]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
IceMystic
Member

Откуда:
Сообщений: 13
s_ustinov
IceMystic
Суть вот в чем:
имеется таблица "Табель работ автомобилей"
В которой есть кроме всего прочего 31 поле со ссылками на другую таблицу (состояние автомобилей (в работе/ТО/Нет водителя/Ремонт и прочее)).
Возникла необходимость отчета за несколько месяцев по каждому автомобилю с количеством дней (по месяцам) с каждым статусом пример таблицы приложен.
Вопрос: как зацепить таблицу состояний к 31ому полю более гуманно, чем 31 раз использовать Union ?

Я правильно понимаю - у вас в таблице отдельные поля для января, февраля и т.д.? Или это вы отчет такой сделали?

Если отдельные поля - то ответ очень простой - нанять специалиста.

Нет, есть поле, в котором записан номер месяца, но оно к вопросу отношения не имеет.
Проблема в том, что в табеле есть 31 поле, (дни) в которых хранятся ссылки на таблицу со статусом авто.
Вот количество одинаковых статусов (ссылок на один и тот же статус) мне нужно посчитать для каждого авто в каждом месяце.
То есть например берем запись в табеле по одной машине.

в табеле есть ссылка на каталог авто, поле с годом табеля, поле с месяцем табеля и ещё 31 поле с ссылками на статус на каждый день.
ссылка[1]
ссылка[2]
ссылка[2]
ссылка[2]
ссылка[2]
ссылка[2]
ссылка[2]
Подобную стуктуру таблицы придумывал не я.
28 апр 19, 17:19    [21873752]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
IceMystic
Member

Откуда:
Сообщений: 13
s_ustinov
IceMystic
Суть вот в чем:
имеется таблица "Табель работ автомобилей"
В которой есть кроме всего прочего 31 поле со ссылками на другую таблицу (состояние автомобилей (в работе/ТО/Нет водителя/Ремонт и прочее)).
Возникла необходимость отчета за несколько месяцев по каждому автомобилю с количеством дней (по месяцам) с каждым статусом пример таблицы приложен.
Вопрос: как зацепить таблицу состояний к 31ому полю более гуманно, чем 31 раз использовать Union ?

Я правильно понимаю - у вас в таблице отдельные поля для января, февраля и т.д.? Или это вы отчет такой сделали?

Если отдельные поля - то ответ очень простой - нанять специалиста.

Нет, есть поле, в котором записан номер месяца, но оно к вопросу отношения не имеет.
Проблема в том, что в табеле есть 31 поле, (дни) в которых хранятся ссылки на таблицу со статусом авто.
Вот количество одинаковых статусов (ссылок на один и тот же статус) мне нужно посчитать для каждого авто в каждом месяце.
То есть например берем запись в табеле по одной машине.

в табеле есть ссылка на каталог авто, поле с годом табеля, поле с месяцем табеля и ещё 31 поле с ссылками на статус на каждый день.
ссылка[1] ссылается на статус "нет водителя"
ссылка[2] ссылается на статус "ремонт"
ссылка[3] ссылается на статус "командировка"
ссылка[4] ссылается на статус "нет работы"
ссылка[5] ссылается на статус "на линии"
ссылка[6] ссылается на статус "на линии"
ссылка[7] ссылается на статус "нет водителя"
...
На выходе кроме прочих данных по авто должна быть информация по каждой машине о количестве соответствующих статусов за месяц
т.е нет водителя - 2
ремонт - 1
командировка - 1
нет работы - 1
на линии - 2


поскольку запись в табеле делается не на каждый день, а одна на весь месяц - пока есть две идеи... Либо цеплять 31 синоним каталога статусов к табелю, либо 31 раз писать union и в каждом новом цеплять каталог статусов к новому полю.
28 апр 19, 17:27    [21873758]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2199
IceMystic

в табеле есть ссылка на каталог авто, поле с годом табеля, поле с месяцем табеля и ещё 31 поле с ссылками на статус на каждый день.
ссылка[1]
ссылка[2]
ссылка[2]
ссылка[2]
ссылка[2]
ссылка[2]
ссылка[2]
Подобную стуктуру таблицы придумывал не я.

Взять паяльник и/или утюг и вдумчиво поспрашивать у того, кто это придумал - ЗАЧЕМ он так?!?!!!

Проблему не решит, но легче станет.

Решение проблемы - заменить эти 33 поля на одно поле - дата. Всё остальное будет мучительно больно и неприятно.
28 апр 19, 17:28    [21873761]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
IceMystic
Возникла необходимость отчета за несколько месяцев по каждому автомобилю с количеством дней (по месяцам) с каждым статусом
Сделать unpivot, потом join, и посчитать.
28 апр 19, 17:29    [21873763]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
s_ustinov
IceMystic
в табеле есть ссылка на каталог авто, поле с годом табеля, поле с месяцем табеля и ещё 31 поле с ссылками на статус на каждый день.
ссылка[1]
ссылка[2]
ссылка[2]
ссылка[2]
ссылка[2]
ссылка[2]
ссылка[2]
Подобную стуктуру таблицы придумывал не я.

Взять паяльник и/или утюг и вдумчиво поспрашивать у того, кто это придумал - ЗАЧЕМ он так?!?!!!
Обычно такое получается, когда секретарша/сэйл/etc доводит свой эксель-файл до уровня используемой подразделением базы данных.

Конечно, более правильно это переделать.
28 апр 19, 17:32    [21873765]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
IceMystic
Member

Откуда:
Сообщений: 13
alexeyvg
s_ustinov
пропущено...

Взять паяльник и/или утюг и вдумчиво поспрашивать у того, кто это придумал - ЗАЧЕМ он так?!?!!!
Обычно такое получается, когда секретарша/сэйл/etc доводит свой эксель-файл до уровня используемой подразделением базы данных.

Конечно, более правильно это переделать.


Безусловно, в в данной таблице уже ОЧЕНЬ много записей, и так просто это не переделать.
28 апр 19, 17:33    [21873767]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
IceMystic
alexeyvg
пропущено...
Обычно такое получается, когда секретарша/сэйл/etc доводит свой эксель-файл до уровня используемой подразделением базы данных.

Конечно, более правильно это переделать.


Безусловно, в в данной таблице уже ОЧЕНЬ много записей, и так просто это не переделать.
В смысле? Как это зависит от количества записей?
Это зависит от количества запросов, это да. Много ли надо переписывать.
28 апр 19, 17:37    [21873769]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2199
IceMystic
alexeyvg
пропущено...
Обычно такое получается, когда секретарша/сэйл/etc доводит свой эксель-файл до уровня используемой подразделением базы данных.

Конечно, более правильно это переделать.


Безусловно, в в данной таблице уже ОЧЕНЬ много записей, и так просто это не переделать.

Переделать - это самый простой вариант.
Я не говорю, что это просто. Перелить все существующие записи в новую таблицу - задача простая, но там, уверен, еще в куче мест переделать надо.
Но без переделки геморроя будет существенно больше.
28 апр 19, 17:37    [21873770]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
IceMystic
Member

Откуда:
Сообщений: 13
alexeyvg
IceMystic
пропущено...


Безусловно, в в данной таблице уже ОЧЕНЬ много записей, и так просто это не переделать.
В смысле? Как это зависит от количества записей?
Это зависит от количества запросов, это да. Много ли надо переписывать.


В таком формате записи ведутся с 2008 года.
На основе этих таблиц создано куча интерфейсов и отчетных форм.
Я начал сопровождать это с прошлого года и потребовался новый отчет формата, который я описал.
Его можно написать в формате кучи маленьких запросиков методами, которые я написал выше но это будет довольно большая стена текста, вот я и хотел поинтересоваться нет ли более адекватных методов.

Если переделывать таблицу - это нужно будет переделывать почти всё, что было написано ранее, до меня, разбираться в куче форм и отлаживать на тестовой базе.
На это, к сожалению, сейчас совсем нет времени.
28 апр 19, 17:47    [21873776]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2199
IceMystic,
Представьте, что вам надо найти неделю (не месяц!) за последний год, в которую было максимальное количество недоступности автомобиля из-за отсутствия водителя. Или недели, в которые все автомобили были доступны всё время.
С подобной структурой данных такие отчеты делать - удовольствие сильно ниже среднего. Не говоря о том, что тормозить будут.
28 апр 19, 17:47    [21873777]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2199
IceMystic
alexeyvg
пропущено...
В смысле? Как это зависит от количества записей?
Это зависит от количества запросов, это да. Много ли надо переписывать.


В таком формате записи ведутся с 2008 года.
На основе этих таблиц создано куча интерфейсов и отчетных форм.
Я начал сопровождать это с прошлого года и потребовался новый отчет формата, который я описал.
Его можно написать в формате кучи маленьких запросиков методами, которые я написал выше но это будет довольно большая стена текста, вот я и хотел поинтересоваться нет ли более адекватных методов.

Если переделывать таблицу - это нужно будет переделывать почти всё, что было написано ранее, до меня, разбираться в куче форм и отлаживать на тестовой базе.
На это, к сожалению, сейчас совсем нет времени.

Ну сделайте индексированное представление этой таблицы с нормальной структурой данных (одно поле дата).
И работайте уже с ним.
28 апр 19, 17:50    [21873778]     Ответить | Цитировать Сообщить модератору
 Re: Присоединение одной таблицы по нескольким полям  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
IceMystic
в табеле есть ссылка на каталог авто, поле с годом табеля, поле с месяцем табеля и ещё 31 поле с ссылками на статус на каждый день.
ссылка[1] ссылается на статус "нет водителя"
ссылка[2] ссылается на статус "ремонт"
ссылка[3] ссылается на статус "командировка"
ссылка[4] ссылается на статус "нет работы"
ссылка[5] ссылается на статус "на линии"
ссылка[6] ссылается на статус "на линии"
ссылка[7] ссылается на статус "нет водителя"
...
На выходе кроме прочих данных по авто должна быть информация по каждой машине о количестве соответствующих статусов за месяц
т.е нет водителя - 2
ремонт - 1
командировка - 1
нет работы - 1
на линии - 2
Примерно так:
declare @t table (id int primary key, y int, m int, day1 int, day2 int, day3 int, day4 int, day5 int);
insert into @t
values
 (1, 2019, 1, 1, 2, 3, 1, 3),
 (2, 2019, 2, 2, 1, 3, 3, 3);
 
select
 a.id, a.y, a.m, b.*
from
 @t a cross apply
 (
  select
   p.[1] as [state1 name], p.[2] as [state2 name], p.[3] as [state3 name]
  from
   (values (a.day1), (a.day2), (a.day3), (a.day4), (a.day5)) d(state)
   pivot
   (
    count(d.state) for d.state in ([1], [2], [3])
   ) p
 ) b;
28 апр 19, 18:50    [21873783]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить