Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Таблица с разными наборами данных. Выборка / 7 сообщений из 7, страница 1 из 1
11.08.2019, 19:59
    #39848003
pol_butcher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с разными наборами данных. Выборка
Добрый день. До этого с данными таблицами не сталкивался и ума не приложу как вытащить данные в одну строку.
Для примера:
Таблица
id---name---val
1---Имя---Вася
1---Фамилия---Пупкин
1---Квартира---1 Квартира
1---Адрес---Ул.Васильева 36
2---Имя---Петя
И так далее.
Как выбрать эти данные в одну строку?
Имя-Фамилия-Квартира-Адрес
Вася-Пупкин-1 Квартира- Ул.Васильева 36

Данных в этой таблице очень много и необходимо делать выборку по разным значениям NAME. Прошу помощи куда копать.
Были идеи каждый запрос сохранять в массив и перебирать с каждым разом. Но чувствую что это что-то не то))
...
Рейтинг: 0 / 0
11.08.2019, 20:17
    #39848008
londinium
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с разными наборами данных. Выборка
pol_butcher,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
USE MASTER
GO
/*
Таблица
id---name---val
1---Имя---Вася
1---Фамилия---Пупкин
1---Квартира---1 Квартира
1---Адрес---Ул.Васильева 36
2---Имя---Петя
*/
WITH TAB(ID,NAME,VAL)
AS
(
  SELECT 1 AS ID,'NAME'AS NAME,'VASYA'AS VAL
    UNION ALL
  SELECT 1 AS ID,'SURNAME'AS NAME,'PUPKIN'AS VAL
    UNION ALL
  SELECT 1 AS ID,'FLAT'AS NAME,'1 FLAT'AS VAL
    UNION ALL
  SELECT 1 AS ID,'ADDRESS'AS NAME,'VASILIEVA 36'
    UNION ALL
  SELECT 2 AS ID,'NAME'AS NAME,'PETIA'        
)

/*
Как выбрать эти данные в одну строку?
Имя-Фамилия-Квартира-Адрес
Вася-Пупкин-1 Квартира- Ул.Васильева 36
*/
SELECT T.VAL+' '+ISNULL(TSURNAMEQUERY.VAL,'')+' '+ISNULL(TFLATQUERY.VAL,'')+' '+ISNULL(TADDRESSQUERY.VAL,'')
FROM TAB AS T
LEFT JOIN TAB AS TSURNAMEQUERY ON T.ID=TSURNAMEQUERY.ID AND TSURNAMEQUERY.NAME='SURNAME'
LEFT JOIN TAB AS TFLATQUERY ON T.ID=TFLATQUERY.ID AND TFLATQUERY.NAME='FLAT'
LEFT JOIN TAB AS TADDRESSQUERY ON T.ID=TADDRESSQUERY.ID AND TADDRESSQUERY.NAME='ADDRESS'
WHERE T.NAME='NAME'
...
Рейтинг: 0 / 0
11.08.2019, 20:31
    #39848012
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с разными наборами данных. Выборка
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select
 p.*
from
 (
  values
   (1, 'Имя', 'Вася'),
   (1, 'Фамилия', 'Пупкин'),
   (1, 'Квартира', '1 Квартира'),
   (1, 'Адрес', 'Ул.Васильева 36'),
   (2, 'Имя', 'Петя')
 ) t(id, name, val)
pivot
(
 min(val) for name in ([Имя], [Фамилия], [Квартира], [Адрес])
) p;
...
Рейтинг: 0 / 0
11.08.2019, 20:57
    #39848019
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с разными наборами данных. Выборка
Непонятно, что определяет порядок строк в этой чудо-таблице.
Придётся не заморачиваться с этим.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
WITH Tab AS
(
 SELECT * FROM
 (VALUES
  (1,'Имя','Вася')
 ,(1,'Фамилия','Пупкин')
 ,(1,'Квартира','1 Квартира')
 ,(1,'Адрес','Ул.Васильева 36')
 ,(2,'Имя','Петя')
 ) T(id,[Name],val)
)
SELECT STUFF(
(
 SELECT ' - '+TT.[name]+' - '+TT.[val]
 FROM Tab TT
 WHERE TT.id=Tab.id
 FOR XML PATH(''),TYPE
).value('.','nvarchar(max)')
,1,3,''
) S
FROM Tab
GROUP BY id
ORDER BY id;
...
Рейтинг: 0 / 0
12.08.2019, 09:46
    #39848111
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с разными наборами данных. Выборка
iapНепонятно, что определяет порядок строк в этой чудо-таблице.
Придётся не заморачиваться с этим.
Не, ну при желании можно и заморочиться, задав порядок явно внешней таблицей )

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
WITH Tab AS
(
 SELECT * FROM
 (VALUES
  (1,'Имя','Вася')
 ,(1,'Фамилия','Пупкин')
 ,(1,'Квартира','1 Квартира')
 ,(1,'Адрес','Ул.Васильева 36')
 ,(2,'Имя','Петя')
 ) T(id,[Name],val)
), ord AS 
(SELECT * FROM (VALUES (1, 'Адрес'), (2, 'Квартира'), (3, 'Фамилия'), (4, 'Имя')) AS t(id, [Name]))
SELECT STUFF(
(
 SELECT ' - '+TT.[name]+' - '+TT.[val]
 FROM Tab TT
        INNER JOIN ord ON tt.Name = ord.name
 WHERE TT.id=Tab.id
 ORDER BY ord.id
 FOR XML PATH(''),TYPE
).value('.','nvarchar(max)')
,1,3,''
) S
FROM Tab
GROUP BY id
ORDER BY id;
...
Рейтинг: 0 / 0
12.08.2019, 18:43
    #39848492
pol_butcher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с разными наборами данных. Выборка
Какие страшные запросы)). Явно я не sqlщик. Скажите, а зачем так делают. Все данные в одной таблице. Лучше же таблицы разделить?
...
Рейтинг: 0 / 0
13.08.2019, 08:16
    #39848595
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с разными наборами данных. Выборка
pol_butcherКакие страшные запросы)). Явно я не sqlщик. Скажите, а зачем так делают. Все данные в одной таблице. Лучше же таблицы разделить?

Это недоделанный вариант EAV модели хранения в РСУБД.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Таблица с разными наборами данных. Выборка / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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