Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как присоединить таблицу, чтобы не искажались данные / 12 сообщений из 12, страница 1 из 1
24.01.2021, 14:34
    #40038407
palladin600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таблицу, чтобы не искажались данные
Никак не получается присоединить табличку Available.
Есть две таблицы (Шкафы и размеры):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
declare @Subjects table(name varchar(10), id int)
insert into @Subjects(name, id)
select 'Шкаф1', 1 union all
select 'Шкаф2', 2 union all
select 'Шкаф3', 3 union all
select 'Шкаф4', 4 union all
select 'Шкаф5', 5

declare @Sizes table(ID int, Width int, Height int, [Length] int)
insert into @Sizes(ID, Width, Height, [Length])
select 1, 100, 170, 200 union all --1
select 2, 120, 170, 100 union all --2
select 3, 100, 170, 200 union all --1
select 4, 130, 200, 300 union all --3
select 5, 100, 170, 200           --1



и табличка типа актуальной доступности на текущий момент времени:
Код: sql
1.
2.
3.
4.
5.
declare @Availaible table(PersonID int, SubjectID int, Quantity int)
insert into @Availaible(PersonID, SubjectID, Quantity)
select 1, 1, 6 union all 
select 2, 2, 5 union all
select 2, 1, 3



запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT CONVERT(VARCHAR(4), sz.Width) + 'x'  + CONVERT(VARCHAR(4), sz.Height) + 'x' + CONVERT(VARCHAR(4), sz.[Length]) as UniqueSize, 
	COUNT_BIG(*) as TotalCount, Count(a.SubjectID) as isAvailaible
	FROM @Subjects s INNER JOIN 
		 @Sizes sz ON s.ID = sz.ID left JOIN
		 @Availaible a ON a.SubjectID = s.id
		 GROUP BY CONVERT(VARCHAR(4), sz.Width) + 'x'  + CONVERT(VARCHAR(4), sz.Height) + 'x' + CONVERT(VARCHAR(4), sz.[Length]) 
		 ORDER BY 2


выдаёт не верный результат:
Код: plaintext
1.
2.
3.
UniqueSize	TotalCount	isAvailaible
120x170x100	1		1
130x200x300	1		0
100x170x200	 4 		2	<--ошибка, общее кол-во по этому размеру 3, а не 4!

а как получить вот такой результат:
Код: plaintext
1.
2.
3.
UniqueSize	TotalCount	isAvailaible(as bit)
120x170x100	1		1
130x200x300	1		0
100x170x200	 3 		1

подсобите, плиз, исправить запрос.
...
Рейтинг: 0 / 0
24.01.2021, 15:36
    #40038417
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таблицу, чтобы не искажались данные
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT CONVERT(VARCHAR(4), sz.Width) + 'x'  + CONVERT(VARCHAR(4), sz.Height) + 'x' + CONVERT(VARCHAR(4), sz.[Length]) as UniqueSize, a.SubjectID
	--COUNT_BIG(*) as TotalCount, Count(a.SubjectID) as isAvailaible
	FROM @Subjects s INNER JOIN 
		 @Sizes sz ON s.ID = sz.ID left JOIN
		 @Availaible a ON a.SubjectID = s.id
		 order by sz.Width, sz.Height, sz.[Length]
--		 GROUP BY sz.Width, sz.Height, sz.[Length]
		 --ORDER BY 2



На чо жалуемся?
Код: plaintext
1.
2.
3.
4.
5.
6.
UniqueSize	SubjectID
100x170x200	1
100x170x200	1
100x170x200	NULL
100x170x200	NULL
120x170x100	2
130x200x300	NULL

На себя жалуемся.
...
Рейтинг: 0 / 0
24.01.2021, 16:09
    #40038425
palladin600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таблицу, чтобы не искажались данные
aleks222, спасибо дорогой )
но, ответ на мой вопрос не совсем корректен.
спасибо, что пытаешься вместе со мной решить вопрос, но пока мимо.

мне, в идеале бы получить такой набор записей:
Код: plaintext
1.
2.
3.
UniqueSize	TotalCount	AvailaibleQty	PersonsCount
120x170x100	1		5		1
130x200x300	1		0		0
100x170x200	 3 		9		2
где,
  • UniqueSize - Существующий Уникальный Размер
  • TotalCount - Количество каждого из уникальных размеров
  • AvailaibleQty - Общее реально доступное количество
  • PersonsCount - Количество человек, у кого есть SubjectID
...
Рейтинг: 0 / 0
24.01.2021, 16:32
    #40038429
FantomGood
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таблицу, чтобы не искажались данные
ключевые слова count и distinct
Код: sql
1.
2.
3.
4.
5.
6.
7.
		 SELECT CONVERT(VARCHAR(4), sz.Width) + 'x'  + CONVERT(VARCHAR(4), sz.Height) + 'x' + CONVERT(VARCHAR(4), sz.[Length]) as UniqueSize, a.SubjectID
		 ,sz.Id as unique_size_id -- <---- смотреть тут 

	FROM @Subjects s INNER JOIN 
		 @Sizes sz ON s.ID = sz.ID left JOIN
		 @Availaible a ON a.SubjectID = s.id
		 order by sz.Width, sz.Height, sz.[Length]


palladin600
aleks222, спасибо дорогой )
но, ответ на мой вопрос не совсем корректен.
спасибо, что пытаешься вместе со мной решить вопрос, но пока мимо.

мне, в идеале бы получить такой набор записей:
Код: plaintext
1.
2.
3.
UniqueSize	TotalCount	AvailaibleQty	PersonsCount
120x170x100	1		5		1
130x200x300	1		0		0
100x170x200	 3 		9		2
где,
  • UniqueSize - Существующий Уникальный Размер
  • TotalCount - Количество каждого из уникальных размеров
  • AvailaibleQty - Общее реально доступное количество
  • PersonsCount - Количество человек, у кого есть SubjectID
...
Рейтинг: 0 / 0
24.01.2021, 21:24
    #40038459
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таблицу, чтобы не искажались данные
palladin600,

у Вас ошибка в данных, так как нарушена уникальность списка размеров.
Поскольку в Ваших данных данных понятие "Шкаф" полностью эквивалентно понятию "размер", то строки 3 и 5 в таблице "Размеры" - лишние, соответственно, "Шкаф3" и "Шкаф5" введены в справочник некорректно, это избыточное дублирование.

Если вы имели в виду, что один и тот же шкаф может иметь несколько вариантов размеров, то справочники также составлены некорректно.
...
Рейтинг: 0 / 0
25.01.2021, 13:40
    #40038655
palladin600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таблицу, чтобы не искажались данные
Владислав Колосов
palladin600,

у Вас ошибка в данных, так как нарушена уникальность списка размеров.
Поскольку в Ваших данных данных понятие "Шкаф" полностью эквивалентно понятию "размер", то строки 3 и 5 в таблице "Размеры" - лишние, соответственно, "Шкаф3" и "Шкаф5" введены в справочник некорректно, это избыточное дублирование.

Если вы имели в виду, что один и тот же шкаф может иметь несколько вариантов размеров, то справочники также составлены некорректно.


нету здесь ошибки!

просто размеры каждого шкафа вынесены в отдельную таблицу.
Таблицы Subjects + Sizes, они вместе. На каждый SubjectID равный ему SizeID.

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

иначе говоря, subjects имеет обобщённое наименование.
А зависимая подтаблица уже содержит набор свойств, характерных для отдельного Subject.
...
Рейтинг: 0 / 0
25.01.2021, 20:48
    #40038803
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таблицу, чтобы не искажались данные
palladin600, сначала группируйте @Availaible по SubjectID, а уже потом всё остальное
...
Рейтинг: 0 / 0
28.01.2021, 11:46
    #40039592
FantomGood
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таблицу, чтобы не искажались данные
Код: sql
1.
COUNT_BIG(distinct sz.ID) as TotalCount
...
Рейтинг: 0 / 0
28.01.2021, 20:18
    #40039712
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таблицу, чтобы не искажались данные
palladin600,

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

В таблице доступности перечислено:
Шкаф1 (SubjectId = 1) 6 + 3 = 9 шт всего
Шкаф2 (SubjectId = 2) 5 шт всего

В итоге должны получить
размер: 100, 170, 200 доступно: 9 тип: "Шкаф1"
размер: 120, 170, 100 доступно: 5 тип: "Шкаф2"
...
Рейтинг: 0 / 0
29.01.2021, 22:38
    #40040018
palladin600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таблицу, чтобы не искажались данные
Владислав Колосов
В таком случае один и тот же шкаф записан в справочнике три раза под разными именами. Если вы считаете, что это разные шкафы, то не можете группировать их по размеру

Это не один и тот же шкаф. Это разные шкафы. Просто у них размеры одинаковые.
И, соль в том, что мне надо сгруппировать их по размеру. (

Просто не хочется делать 2 запроса. Я делаю так:
Первый запрос, уточняю сколько существует каждого из уникального размера вообще в природе (в каталоге):
Код: sql
1.
2.
3.
4.
5.
SELECT CONVERT(VARCHAR(4), sz.Width) + 'x'  + CONVERT(VARCHAR(4), sz.Height) + 'x' + CONVERT(VARCHAR(4), sz.[Length]) as UniqueSize, COUNT_BIG(*) as TotalCount
	FROM @Subjects s inner JOIN 
		 @Sizes sz ON s.ID = sz.ID 
		 GROUP BY CONVERT(VARCHAR(4), sz.Width) + 'x'  + CONVERT(VARCHAR(4), sz.Height) + 'x' + CONVERT(VARCHAR(4), sz.[Length]) 
		 ORDER BY 1



во втором запросе я уточняю какое количество шкафов фактически изготовлено на производстве(AvailaibleQty), и у скольких мастеров(PersonID):
Код: sql
1.
2.
3.
4.
5.
6.
SELECT CONVERT(VARCHAR(4), sz.Width) + 'x'  + CONVERT(VARCHAR(4), sz.Height) + 'x' + CONVERT(VARCHAR(4), sz.[Length]) as UniqueSize, ISNULL(SUM(a.Quantity),0) as AvailaibleQty, Count(a.PersonID) as PersonsCount
	FROM @Subjects s inner JOIN 
		 @Sizes sz ON s.ID = sz.ID LEFT JOIN
		 @Availaible a ON a.SubjectID = s.id
		 GROUP BY CONVERT(VARCHAR(4), sz.Width) + 'x'  + CONVERT(VARCHAR(4), sz.Height) + 'x' + CONVERT(VARCHAR(4), sz.[Length]) 
		 ORDER BY 1



выдаются два списка результатов:
существет в природе
Код: plaintext
1.
2.
3.
UniqueSize	TotalCount
100x170x200	3
120x170x100	1
130x200x300	1

доступно на производстве
Код: plaintext
1.
2.
3.
UniqueSize	AvailaibleQty	PersonsCount
100x170x200	9		2
120x170x100	5		1
130x200x300	0		0

а я бы хотел свести это всё в один запрос, сопоставить выдачу по UniqueSize , и вот тут вопрос, как это сделать? Потому что, если я всё пытаюсь объединить, то совсем не тот результат получается, не верные цифры.
...
Рейтинг: 0 / 0
30.01.2021, 08:10
    #40040044
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таблицу, чтобы не искажались данные
Печально я гляжу на это поколенье...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT CONVERT(VARCHAR(4), sz.Width) + 'x'  + CONVERT(VARCHAR(4), sz.Height) + 'x' + CONVERT(VARCHAR(4), sz.[Length]) as UniqueSize
      , count(distinct s.id) as TotalCount
      , ISNULL(SUM(a.Quantity),0) as AvailaibleQty
      , Count(a.PersonID) as PersonsCount
       FROM @Subjects s inner JOIN 
              @Sizes sz ON s.ID = sz.ID LEFT JOIN
             @Availaible a ON a.SubjectID = s.id
             GROUP BY sz.Width, sz.Height, sz.[Length] 
              ORDER BY 1
...
Рейтинг: 0 / 0
01.02.2021, 16:29
    #40040570
palladin600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таблицу, чтобы не искажались данные
aleks222,

Большое спасибооо!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как присоединить таблицу, чтобы не искажались данные / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]