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

Откуда:
Сообщений: 61
Здравствуйте. Не получается вывести нужные данные. Есть следующая таблица:

2 столбца строковых, в одном из которых (может быть любой из двух) написано имя полки, в другом напротив имени полки написан предмет который она хранит. Столбцы с каждой новой строкой могут меняться. Нужно вывести имя полки, уникальные одинаковые предметы которые есть в таблице для каждой полки и остальные поля таблицы *. Совпадений может быть много, нужно вывести только уникальные. Моих знаний пока недостаточно для реализации задачи, вот что я накидал.

select distinct(predmeti1),predmeti2,* from table1 where (predmeti2='namepolka1') or (predmeti2='namepolka2')
 union
(select distinct(predmeti2),predmeti1,* from table1 where (predmeti1='namepolka1')or (predmeti1='namepolka2'))
order by date_buy desc


Набор данных:

полка1|яблоко
апельсин|полка2
мандарин|полка1
полка1|апельсин
лимон|полка1
вишня|полка2
полка2|мандарин

Нужно вывести:
полка2|апельсин
полка1|апельсин
полка2|мандарин
полка1|мандарин
24 авг 17, 17:03    [20747585]     Ответить | Цитировать Сообщить модератору
 Re: Объединение запросов и вывод данных  [new]
iiyama
Member

Откуда:
Сообщений: 642
select distinct
case when predmeti1 like N'полка%' then predmeti1 else predmeti2 end as [Полки],
case when predmeti1 like N'полка%' then predmeti2 else predmeti1 end as [Предметы]
from table1 
24 авг 17, 18:16    [20747729]     Ответить | Цитировать Сообщить модератору
 Re: Объединение запросов и вывод данных  [new]
982183
Member

Откуда: VL
Сообщений: 3350
Moneo
полка1|яблоко
апельсин|полка2
мандарин|полка1
полка1|апельсин
лимон|полка1
вишня|полка2
полка2|мандарин

Нужно вывести:
полка2|апельсин
полка1|апельсин
полка2|мандарин
полка1|мандарин


Куда и почему делись Яблоки?
25 авг 17, 01:29    [20748211]     Ответить | Цитировать Сообщить модератору
 Re: Объединение запросов и вывод данных  [new]
Moneo
Member

Откуда:
Сообщений: 61
982183, потому что яблоки не на двух полках, а нужно выводить уникальные предметы присутствующие там и там, остальные пропускать
25 авг 17, 10:32    [20748540]     Ответить | Цитировать Сообщить модератору
 Re: Объединение запросов и вывод данных  [new]
Moneo
Member

Откуда:
Сообщений: 61
iiyama,не работает
25 авг 17, 10:44    [20748601]     Ответить | Цитировать Сообщить модератору
 Re: Объединение запросов и вывод данных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20198
Moneo, добавьте условие отбора, а в нём - подзапрос, выбирающий записи с количеством не менее 2.
25 авг 17, 11:17    [20748736]     Ответить | Цитировать Сообщить модератору
 Re: Объединение запросов и вывод данных  [new]
Lanselot
Member

Откуда:
Сообщений: 76
DECLARE @T TABLE ([Полки] varchar(30), [Предметы] varchar(30))
INSERT INTO @T ([Полки], [Предметы])
VALUES
	('полка1','яблоко'),
	('апельсин','полка2'),
	('мандарин','полка1'),
	('полка1','апельсин'),
	('лимон','полка1'),
	('вишня','полка2'),
	('полка2','мандарин')

;WITH A AS 
	(	SELECT 
			CASE WHEN [Полки] like 'полка%' THEN [Полки] ELSE [Предметы] END as [Полки],
			CASE WHEN [Предметы] like 'полка%' THEN [Полки] ELSE [Предметы] END as [Предметы]
		FROM @T )

SELECT W.* 
FROM A W
	CROSS APPLY (SELECT COUNT(*) AS CNT FROM A Q WHERE Q.[Предметы] = W.[Предметы]) AS T
WHERE 1=1
	AND CNT = 2
ORDER BY [Предметы], [Полки]
25 авг 17, 11:24    [20748769]     Ответить | Цитировать Сообщить модератору
 Re: Объединение запросов и вывод данных  [new]
Serп
Member

Откуда:
Сообщений: 17
Lanselot,
полок может быть и не 2, тогда уже по идее хотя бы так:
DECLARE @T TABLE ([Полки] varchar(30), [Предметы] varchar(30))
INSERT INTO @T ([Полки], [Предметы])
VALUES
	('полка1','яблоко'),
	('апельсин','полка2'),
	('мандарин','полка1'),
	('полка1','апельсин'),
	('лимон','полка1'),
	('вишня','полка2'),
	('полка2','мандарин')

;WITH A AS 
	(	SELECT 
			CASE WHEN [Полки] like 'полка%' THEN [Полки] ELSE [Предметы] END as [Полки],
			CASE WHEN [Предметы] like 'полка%' THEN [Полки] ELSE [Предметы] END as [Предметы]
		FROM @T )

SELECT W.* 
FROM A W
	CROSS APPLY (SELECT COUNT(*) AS CNT FROM A Q WHERE Q.[Предметы] = W.[Предметы]) AS T
WHERE 1=1
	AND CNT = (select count(distinct [Полки]) from A)
ORDER BY [Предметы], [Полки]
25 авг 17, 11:33    [20748794]     Ответить | Цитировать Сообщить модератору
 Re: Объединение запросов и вывод данных  [new]
Lanselot
Member

Откуда:
Сообщений: 76
Я трактую
Moneo
присутствующие там и там, остальные пропускать

что полок две
25 авг 17, 11:48    [20748840]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить