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

Откуда:
Сообщений: 41
Здравствуйте! Есть 2 таблицы:
CREATE TABLE Options (
    id_opt smallint NOT NULL PRIMARY KEY,
    [name_opt] varchar(10)
    );
    
CREATE TABLE Items (
    id_item int NOT NULL,
    id_opt smallint FOREIGN KEY REFERENCES Options(id_opt),
    some_date smalldatetime,
    [some_val] int
    );


Надо построить таблицу вида:
name0 Name1 … nameN
id_item0 Value Value … Value
id_item1 Value Value … Value

INSERT INTO params VALUES (1, 'param_1');
INSERT INTO Options VALUES (2, 'param_2');
INSERT INTO Options VALUES (3, 'param_3');
INSERT INTO Options VALUES (4, 'param_4');
INSERT INTO Options VALUES (5, 'param_5');

INSERT INTO Items VALUES (1, 1, '1980-10-1 11:15:10', 5);
INSERT INTO Items VALUES (1, 1, '1980-10-1 11:15:20', 15);
INSERT INTO Items VALUES (1, 1, '1981-8-5 11:15:30', 234);
INSERT INTO Items VALUES (1, 1, '1980-10-1 11:15:40', 654);
INSERT INTO Items VALUES (1, 2, '1980-10-1 11:15:10', 7);
INSERT INTO Items VALUES (1, 3, '1980-10-1 11:15:10', 854);
INSERT INTO Items VALUES (2, 1, '1980-10-1 11:15:10', 75);
INSERT INTO Items VALUES (2, 3, '1980-10-1 11:15:10', 84);
INSERT INTO Items VALUES (2, 5, '1980-10-1 11:15:10', 33);
INSERT INTO Items VALUES (3, 1, '1980-10-1 11:15:10', 35);
INSERT INTO Items VALUES (3, 2, '1980-10-1 11:15:10', 22);
INSERT INTO Items VALUES (3, 3, '1980-10-1 11:15:10', 15);
INSERT INTO Items VALUES (3, 4, '1980-10-1 11:15:10', 45);
INSERT INTO Items VALUES (3, 5, '1980-10-1 11:15:10', 564);

SELECT id_item,
       param_1 = ISNULL((SELECT [some_val] FROM Items WHERE [name_opt] = 'param_1' AND id_item =
  sel.id_item),0),
       param_2 = ISNULL((SELECT [some_val] FROM Items WHERE [name_opt] = 'param_2' AND id_item =
  sel.id_item),0),
       param_3 = ISNULL((SELECT [some_val] FROM Items WHERE [name_opt] = 'param_3' AND id_item =
  sel.id_item),0),
       param_4= ISNULL((SELECT [some_val] FROM Items WHERE [name_opt] = 'param_4' AND id_item =
  sel.id_item),0),
       param_5= ISNULL((SELECT [some_val] FROM Items WHERE [name_opt] = 'param_5' AND id_item =
  sel.id_item),0)
     FROM (select id_item, [name_opt], [some_val] from Items join Options
ON (Items.id_opt = Options.id_opt)) sel
     GROUP BY id_item


Пишет: "Столбец "sel.name" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY." Как быть, делал по аналогии, как увидел где-то в интернете.
25 сен 16, 14:28    [19705726]     Ответить | Цитировать Сообщить модератору
 Re: Не получается составить таблицу  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
В вашем запросе нет ни одного упоминания поля name, поэтому он не может приводить к указанной ошибке.
25 сен 16, 14:30    [19705731]     Ответить | Цитировать Сообщить модератору
 Re: Не получается составить таблицу  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
Гавриленко Сергей Алексеевич,

sel.name_opt на самом деле, опечатался
25 сен 16, 14:36    [19705738]     Ответить | Цитировать Сообщить модератору
 Re: Не получается составить таблицу  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
И какой name_opt должен выбирать сервер в группе id_item?
25 сен 16, 14:43    [19705749]     Ответить | Цитировать Сообщить модератору
 Re: Не получается составить таблицу  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
Гавриленко Сергей Алексеевич,

переписал все внутренние селекты так:
param_1 = ISNULL((SELECT [value] FROM Objects_params WHERE id_param = 1 AND id_object =
  sel.id_object),0)

надо на определенную дату (они не повторяются, у меня есть индекс), надо дописать where, только куда?
25 сен 16, 14:51    [19705759]     Ответить | Цитировать Сообщить модератору
 Re: Не получается составить таблицу  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
Vyacheslav07
Гавриленко Сергей Алексеевич,

переписал все внутренние селекты так:
param_1 = ISNULL((SELECT [some_val] FROM Items WHERE id_opt = 1 AND id_item =
  sel.id_item),0)

надо на определенную дату (они не повторяются, у меня есть индекс), надо дописать where, только куда?
25 сен 16, 14:52    [19705762]     Ответить | Цитировать Сообщить модератору
 Re: Не получается составить таблицу  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
Гавриленко Сергей Алексеевич,

у меня получилось все вот так:
SELECT id_item,
       param_1 = ISNULL((SELECT [some_val] FROM Items WHERE [name_opt] = 'param_1' AND id_item =
  sel.id_item AND cdate = '1980-10-1 11:15:10'),0),
       param_2 = ISNULL((SELECT [some_val] FROM Items WHERE [name_opt] = 'param_2' AND id_item =
  sel.id_item AND cdate = '1980-10-1 11:15:10'),0),
       param_3 = ISNULL((SELECT [some_val] FROM Items WHERE [name_opt] = 'param_3' AND id_item =
  sel.id_item AND cdate = '1980-10-1 11:15:10'),0),
       param_4= ISNULL((SELECT [some_val] FROM Items WHERE [name_opt] = 'param_4' AND id_item =
  sel.id_item AND cdate = '1980-10-1 11:15:10'),0),
       param_5= ISNULL((SELECT [some_val] FROM Items WHERE [name_opt] = 'param_5' AND id_item =
  sel.id_item AND cdate = '1980-10-1 11:15:10'),0)
     FROM (select id_item, [name_opt], [some_val] from Items join Options
ON (Items.id_opt = Options.id_opt)) sel
     GROUP BY id_itemt


А как можно сделать, если этих параметров очень много и мне неохота писать много повторяющегося кода?
25 сен 16, 15:05    [19705785]     Ответить | Цитировать Сообщить модератору
 Re: Не получается составить таблицу  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
вместо "cdate" на самом деле "some_date"
25 сен 16, 15:06    [19705787]     Ответить | Цитировать Сообщить модератору
 Re: Не получается составить таблицу  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4176
Vyacheslav07
Гавриленко Сергей Алексеевич,

у меня получилось все вот так:
SELECT id_item,
       param_1 = ISNULL((SELECT [some_val] FROM Items WHERE [name_opt] = 'param_1' AND id_item =
  sel.id_item AND cdate = '1980-10-1 11:15:10'),0),
       param_2 = ISNULL((SELECT [some_val] FROM Items WHERE [name_opt] = 'param_2' AND id_item =
  sel.id_item AND cdate = '1980-10-1 11:15:10'),0),
       param_3 = ISNULL((SELECT [some_val] FROM Items WHERE [name_opt] = 'param_3' AND id_item =
  sel.id_item AND cdate = '1980-10-1 11:15:10'),0),
       param_4= ISNULL((SELECT [some_val] FROM Items WHERE [name_opt] = 'param_4' AND id_item =
  sel.id_item AND cdate = '1980-10-1 11:15:10'),0),
       param_5= ISNULL((SELECT [some_val] FROM Items WHERE [name_opt] = 'param_5' AND id_item =
  sel.id_item AND cdate = '1980-10-1 11:15:10'),0)
     FROM (select id_item, [name_opt], [some_val] from Items join Options
ON (Items.id_opt = Options.id_opt)) sel
     GROUP BY id_itemt


А как можно сделать, если этих параметров очень много и мне неохота писать много повторяющегося кода?


сделайте динамический запрос, сгенерируйте всё то, что вам "неохота" писать
25 сен 16, 15:21    [19705816]     Ответить | Цитировать Сообщить модератору
 Re: Не получается составить таблицу  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
Ролг Хупин,

много инфы в интернете, но я все-равно не могу понять, с sql я не на "ты", я так понимаю надо писать цикл по всем параметрам?
25 сен 16, 15:37    [19705839]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить