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

Откуда:
Сообщений: 197
Есть 2 несвязанные таблицы. 1 - Kartochka и 2 - Remont
Надо сделать такую табличку:

Наименование Месяц Общее кол-во изготовл. Вина потреб./шт. Вина потреб./% Вина пост./шт. Вина пост./%
Naimenovanie 1 Date_Kartochka 1 COUNT(Naimenovanie 1) Выборка из Remont | Выборка из Remont | Выборка из Remont
Naimenovanie 2 Date_Kartochka 2 COUNT(Naimenovanie 2)
... ... ...
Naimenovanie N Date_Kartochka N COUNT(Naimenovanie N)

Сделал вот такой запрос, но дальше не могу догнать как связать с таблицей Remont=(

SELECT Naimenovanie as Наименование, DATENAME(MONTH, Date_Kartochka) as Месяц, COUNT(Naimenovanie) as [Изготовлено/шт.] FROM Kartochka where Ypakovka='true' and Tematika='Комбайн' GROUP BY Naimenovanie, DATENAME(MONTH, Date_Kartochka) Order BY Naimenovanie 


Условия для выборки из Remont вот такие:

(SELECT COUNT(a.Naimenovanie) WHERE Klass_Neispr IN ('Производственный','Отказ ЭРИ') as [Кол-во завод/шт.], (SELECT COUNT(b.Naimenovanie) where Ypakovka='true')/(SELECT COUNT(a.Naimenovanie)*100.0 WHERE Klass_Neispr IN ('Производственный','Отказ ЭРИ')) as [Поставщик/%] ,(SELECT COUNT(a.Naimenovanie) WHERE Klass_Neispr IN ('Эксплуатационный', 'Дефект не подтвердился') as [Кол-во потр./шт.], (SELECT COUNT(b.Naimenovanie) where Ypakovka='true')/(SELECT COUNT(a.Naimenovanie)*100.0 WHERE Klass_Neispr IN ('Эксплуатационный','Дефект не подтвердился')) as [Потребитель/%]


Помогите правильно составить запрос, а то че-то я совсем не могу догнать как правильно join сделать! Спасибо за советы!
6 июл 15, 08:03    [17855639]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1750
FOGOT-BAstA,

для начала приведите структуру таблиц Kartochka и Remont:
sp_help 'Kartochka'
sp_help 'Remont'
6 июл 15, 12:46    [17856848]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1750
хотя туплю, если у вас таблицы не связанные вам нужно декартово множество что ли?
+
что то попахивает маразмом проектирования бд
6 июл 15, 12:48    [17856861]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
felix_ff
хотя туплю, если у вас таблицы не связанные вам нужно декартово множество что ли?
+
что то попахивает маразмом проектирования бд


Нет, декартово не надо!
Необходимо подсчитать, сколько из проданных изделий возвращались (в штуках и процентах (от общего количества)) и по чьей вине.

Общее количество берем из таблицы Kartochka, а что приходило обратно из Remont. Сейчас понимаю, что надо было связать их, но сейчас уже никак!

Вот листинг таблиц:
kartochka
[ID_Kartochka] [bigint] IDENTITY(1,1) NOT NULL,
	[Tematika] [varchar](50) NOT NULL,
	[Naimenovanie] [varchar](100) NOT NULL,
	[Zav_Nomer] [varchar](30) NOT NULL,
	[Date_Kartochka] [datetime] NULL CONSTRAINT [DF_Kartochka_Date_Kartochka]  DEFAULT (getdate()),
	[Date_Ypakovka] [datetime] NULL,
	[Date_Otpravka] [datetime] NULL,
	[Nastroyka] [bit] NULL CONSTRAINT [DF_Kartochka_Nastroyka]  DEFAULT ((0)),
	[Ypakovka] [bit] NULL CONSTRAINT [DF_Kartochka_Ypakovka]  DEFAULT ((0)),
	[Otpravlen] [bit] NULL CONSTRAINT [DF_Kartochka_Otpravlen]  DEFAULT ((0)),
	[Primech_Kartochka] [varchar](500) NULL,
	[Primech_Nastroyka] [varchar](500) NULL,
	[Primech_Ypakovka] [varchar](500) NULL,
	[Sborka] [bit] NULL CONSTRAINT [DF_Kartochka_Sborka]  DEFAULT ((0)),
	[FIO_Montazh] [varchar](100) NULL,
	[FIO_Sborka] [varchar](100) NULL,
	[FIO_Programm] [varchar](100) NULL,
	[FIO_Nastroyka] [varchar](100) NULL,
	[FIO_Progon] [varchar](100) NULL,
	[FIO_PSI] [varchar](100) NULL,
	[Vers_Po] [varchar](50) NULL,
	[Nomer_KZ] [varchar](30) NULL,
	[Dec_Nomer] [varchar](50) NULL,
	[Date_Programm] [datetime] NULL,
	[Date_Nastr] [datetime] NULL,
	[Date_Progon] [datetime] NULL,
	[Date_PSI] [datetime] NULL,
	[Prichina_Spisan] [varchar](500) NULL,
	[Zakazchik] [varchar](100) NULL,
	[Spisan] [bit] NULL CONSTRAINT [DF_Kartochka_Spisan]  DEFAULT ((0)),
	[Montazh] [bit] NULL CONSTRAINT [DF_Kartochka_Montazh]  DEFAULT ((0)),
	[Sklad] [bit] NULL CONSTRAINT [DF_Kartochka_Sklad]  DEFAULT ((0)),
	[Primech_Sklad] [varchar](500) NULL,
	[Primech_Montazh] [varchar](500) NULL,
	[Date_Sklad_Prihod] [datetime] NULL,
	[Date_Montazh_Okonchen] [datetime] NULL,
	[Date_Nastroyka] [datetime] NULL


Remont:
[ID_Remont] [int] IDENTITY(1,1) NOT NULL,
	[Nomer_Protokol] [int] NULL CONSTRAINT [DF_Remont_Nomer_Protokol]  DEFAULT (NEXT VALUE FOR [CounterRemont]),
	[Tematika] [varchar](50) NOT NULL,
	[Naimenovanie] [varchar](100) NOT NULL,
	[Dec_Nomer] [varchar](50) NULL,
	[Documenti] [varchar](50) NULL,
	[Zav_Nomer] [varchar](50) NULL,
	[Recl_Act] [varchar](300) NULL,
	[Date_Proizv] [datetime] NULL,
	[Etap] [varchar](50) NULL,
	[Date_Post] [datetime] NULL,
	[Date_End] [datetime] NULL,
	[Vid_Rabot] [varchar](50) NULL,
	[Narabotka] [varchar](50) NULL,
	[Vers_PO] [varchar](50) NULL,
	[Naim_Product] [varchar](50) NULL,
	[Nesootv_Personal] [varchar](500) NULL,
	[V_Rabot] [varchar](3000) NULL,
	[Act_VK] [int] NULL,
	[Date_VK] [datetime] NULL,
	[Klass_Neispr] [varchar](50) NULL,
	[Prichina] [varchar](500) NULL,
	[Zakluch] [varchar](1000) NULL,
	[Predlojenia] [varchar](500) NULL,
	[Vivody] [varchar](1000) NULL,
	[Zakazchik] [varchar](50) NULL,
	[Primechanie] [varchar](500) NULL,
	[Image_Opisanie] [varchar](100) NULL,
	[Opisanie_VK] [varchar](1000) NULL,
	[Closed] [bit] NULL CONSTRAINT [DF_Remont_Closed]  DEFAULT ((0)),
	[Image] [varbinary](max) NULL,
	[Slyjebka] [varchar](100) NULL,
	[Etap_Zakazchik] [varchar](50) NULL
6 июл 15, 13:05    [17856975]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
FOGOT-BAstA
но дальше не могу догнать как связать с таблицей Remont=

Если в таблицах нет поля для соединения, то значит ваш запрос должен такое поле создать
6 июл 15, 13:22    [17857067]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2407
FOGOT-BAstA
Есть 2 несвязанные таблицы


под словом "несвязанные" вы имеете в виду, что не создали форейнкеи?
или что вы не знаете синтаксиса join ?
навскидку
 [Kartochka] as k inner join [Remont] as r on k.[Naimenovanie] =r.[Naimenovanie] and  ...

или таки (как уже спросили) в таблицах нет связующих полей?
7 июл 15, 10:59    [17860894]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
Подумав понял, что нормально соединить их не получиться - по условию в таблице присутствуют значения не связанные с другой таблицей.

Думал сделать 2-мя разными запросами, но из ремонта не получается нормально высчитать количество и процент от общего количества, что не так?

SELECT Naimenovanie, DATENAME(MONTH, Date_Post) as Месяц, (SELECT COUNT(Naimenovanie) WHERE Klass_Neispr IN('Производственный','Отказ ЭРИ')) as [Кол-во завод/шт.], 
(SELECT COUNT(Naimenovanie) FROM Remont WHERE Klass_Neispr IN ('Эксплуатационный', 'Дефект не подтвердился')) as [Кол-во потр./шт.], 
(SELECT COUNT(Naimenovanie) FROM Kartochka where Ypakovka='true')/(SELECT COUNT(Naimenovanie)*100.0 FROM Remont WHERE Klass_Neispr IN ('Эксплуатационный','Дефект не подтвердился')) as [%] 
 FROM Remont where Remont.Tematika='Комбайн' GROUP BY Naimenovanie, DATENAME(MONTH, Date_Post),Klass_Neispr Order By Naimenovanie
7 июл 15, 11:31    [17861141]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
Может все-таки кто-то подскажет, как правильно сделать группировку в таком запросе?
8 июл 15, 11:01    [17866469]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21102
FOGOT-BAstA
Подумав понял, что нормально соединить их не получиться - по условию в таблице присутствуют значения не связанные с другой таблицей.

Начните со смысла происходящего. Как минимум - с вменяемого описания, что хранят таблицы вообще и отдельные (хотя бы имеющие отношение к решаемой задаче) поля в частности.
Пока есть подозрения, что в таблице Kartochka хранятся сведения о некоем оборудовании, а в таблице Remont - соответственно сведения о ремонтах (по гарантии?) этого оборудования.
+
Если я прав, и это учёт производимого и ремонтируемого оборудования - я бы рекомендовал не стараться создать хрен знает какого монстра, дающего "типа правильные" данные, а почитать хоть что-нибудь про проектирование баз данных, нормализацию и т.п... а потом выбросить всю эту ненормализованную бредятину и сделать с нуля как нужно.
8 июл 15, 11:09    [17866536]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31865
FOGOT-BAstA
Может все-таки кто-то подскажет, как правильно сделать группировку в таком запросе?
Вы прочитайте вопросы ещё раз. Для начала, что в ваших терминах означает "несвязанные"?

Связь - это бизнес-понятие, если, глядя на данные, менеджер не может сказать, как связаны карточни и ремонты, то этой связи нет. А если может, то есть.
8 июл 15, 11:13    [17866566]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
Akina, Вы все поняли правильно! Две таблицы: 1-Kartochka - учет отдельно каждой единицы произведенного оборудования, 2 - учет пришедшего на ремонт оборудования (гарантийный и нет). Задача: сделать статистику по месяцам за год - сколько было произведено и сколько было изделий отремонтировано. Отремонтированные изделия должны делиться по чьей вине оно вышло из строя (поле Remont.Klass_Neispr).
И необходимо посчитать количество пришедших на ремонт приборов (шт.) и их процентное соотношение от произведенных в этом же месяце. Причем на ремонт могут придти и приборы прошлых годов. Поэтому, т.к. база ведется только с 2014, в т. Remont будет много данных, которые никак не связаны с т. Kartochka.

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

Должна получиться табличка как в приложении.

К сообщению приложен файл. Размер - 44Kb
8 июл 15, 13:11    [17867171]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21102
Тогда я не понимаю, как таблицы могут быть не связаны. Оборудование, поступившее в ремонт (и заносимое в таблицу Remont), должно быть ранее произведено. И соответственно обязано иметь запись в таблице Kartochka. Кроме того, оборудование обязано иметь некую уникальную идентифицирующую характеристику (серийный номер или типа того), присваиваемую при производстве и регистрируемую в заявке на ремонт - именно по полю, хранящему эту характеристику, и должна устанавливаться связь.
FOGOT-BAstA
на ремонт могут придти и приборы прошлых годов. Поэтому, т.к. база ведется только с 2014, в т. Remont будет много данных, которые никак не связаны с т. Kartochka.

Значит, при поступлении оборудования прошлых годов в ремонт некий минимальный набор данных о нём должен заноситься и в таблицу Kartochka. Хотя бы для того, чтобы отслеживать повторные обращения.
8 июл 15, 13:29    [17867283]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
Akina
Значит, при поступлении оборудования прошлых годов в ремонт некий минимальный набор данных о нём должен заноситься и в таблицу Kartochka. Хотя бы для того, чтобы отслеживать повторные обращения.

Так и будет сделано - инфу заносим и в дальнейшем показывается что и когда приходило. Сейчас вопрос как посчитать количество и процент!=)) Надо чтобы он считал по каждому наименованию процент, а у меня только общий везде выводит...
9 июл 15, 08:22    [17870188]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21102
SELECT SUM(CASE Type WHEN 'Что-то' THEN 1 ELSE 0 END)/COUNT(*) AS SomePercent, ...
9 июл 15, 08:58    [17870272]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
Akina, спасибо за совет. Когда из одно таблицы данные то все ок, но когда из разных, то считает общий...Не могли бы Вы подробнее объяснить как из разных таблиц считать? Общее количество из Kartochka, а пришедшее на ремонт из Remont?
Спасибо за помощь!
10 июл 15, 06:49    [17875076]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21102
FOGOT-BAstA
Не могли бы Вы подробнее объяснить как из разных таблиц считать? Общее количество из Kartochka, а пришедшее на ремонт из Remont?

Я извиняюсь за определённую некорректность фразы, но... если Вам начали отвечать, это ещё не повод перестать думать самостоятельно!
SELECT SUM(CASE Remont.Type WHEN 'Что-то' THEN 1 ELSE 0 END)/COUNT(Kartochka.ID) AS SomePercent, ...
10 июл 15, 09:08    [17875217]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
У Вас, Akina, немного неправильно написан запрос. CASE тут использовать не гуманно, т.к. процент считаться должен вот так:
SELECT COUNT(Kartochka.ID)/SUM(CASE Remont.Type WHEN 'Что-то' THEN 1 ELSE 0 END)*100,0 AS SomePercent
но тогда получается деление на 0 и условие должно быть символьным, а не битовым!
10 июл 15, 13:31    [17876564]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21102
FOGOT-BAstA
процент считаться должен вот так

Я всегда полагал, что процент - это "часть" делить на "всего", а не наоборот...
Есть все карточки. Часть из них - ремонт. Что на что делить будем?
10 июл 15, 13:35    [17876587]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2407
FOGOT-BAstA,

>>CASE использовать не гуманно
>>деление на 0
>> условие должно быть символьным, а не битовым

вы просто жжете напалмом ))
10 июл 15, 13:47    [17876670]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2407
FOGOT-BAstA,

просто у вас видимо кони и люди смешались
забудьте про таблички и джойны
возьмите листок, и распишите, у меня было X видов яблок, Y съели, Z надкусили
мне нужен "процент"= (A/B) *100
10 июл 15, 13:59    [17876747]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31865
StarikNavy
FOGOT-BAstA,

просто у вас видимо кони и люди смешались
забудьте про таблички и джойны
возьмите листок, и распишите, у меня было X видов яблок, Y съели, Z надкусили
мне нужен "процент"= (A/B) *100
+1

Выше уже писал - для начала нужно спросить у менеджера, как связаны данные? как считать?
А не писать сразу запросы.
10 июл 15, 14:17    [17876862]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для несвязанных таблиц  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21102
alexeyvg
Выше уже писал - для начала нужно спросить у менеджера, как связаны данные? как считать?
А не писать сразу запросы.
Это скучно. Гораздо интереснее написать запрос - и пусть менеджер думает, к какой заднице его приляпать.
10 июл 15, 15:05    [17877216]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить