2017-02-09 1 views
0

У меня есть таблица вроде этого:SQL значения вставки из запроса с вычисляемым столбцом

id type | month | value 

Где типа AC, FC или BG

Я хочу, чтобы создать для каждого отдельного идентификатора строки, типа (где тип AC или FC) новая строка с типом AF и значение как AC, если существует, или как FC (AC значение имеет приоритет на FC значение).

На данный момент я могу извлечь уникальный список, в котором для каждого элемента я должен создать новую строку:

select id_prj,month from table where type='AC' or type='FC' group by id_prj,month 

Как создать для каждого элемента вернулся из этого запроса новой строки со значением, что может принимать значение AC или FC в зависимости от его существования.

Ниже пример таблицы

| ID_PRJ | TYPE | MONTH | VALUE | 
----------------------------- 
| 1 | AC | 1 | 1000 | 
----------------------------- 
| 1 | FC | 1 | 200 | 
----------------------------- 
| 3 | BG | 1 | 1000 | 
----------------------------- 
| 4 | FC | 2 | 100 | 

В таблице после вставки должно быть:

| ID_PRJ | TYPE | MONTH | VALUE | 
----------------------------- 
| 1 | AC | 1 | 1000 | 
----------------------------- 
| 1 | FC | 1 | 200 | 
----------------------------- 
| 3 | BG | 1 | 1000 | 
----------------------------- 
| 4 | FC | 2 | 100 | 
----------------------------- 
| 1 | AF | 1 | 1000 | 
----------------------------- 
| 4 | AF | 2 | 100 | 
+0

Я не уверен, что вы ищете на выходе. Можете ли вы добавить немного больше деталей? Пример выхода, который вы получаете сейчас, против того, что вы ищете, будет отличным. –

+0

вывод - id и месяц, и для каждого id и месяца я хочу создать новую строку с идентификатором, месяцем, type = 'AF', value = 'значением строки, где id =' ID ', где type является AC fi существуют или имеют значение FC – Kerby82

+0

новая строка или столбец? и вам необходимо предоставить таблицу данных и то, что данные должны выглядеть, в формате таблицы, впоследствии. Вот недавний вопрос, где они делают это ... http://stackoverflow.com/questions/42143148/t-sql-cross-joins – scsimon

ответ

2

как об этом:

insert into table (ID_PRJ, TYPE, Month, Value) 


select id_prj,type,month,value from (
select id_prj,'FC' as type, month,value , row_number() over (partition by id_prj order by type asc) rowid 
from table 
where type='AC' or type='FC' 
) as x where rowid = 1 
+0

Мне это непонятно. Можете ли вы объяснить логику? Я не знаю, какой раздел и какой FC, как тип – Kerby82

+0

. У запроса Thi есть проблема. Поскольку для одного и того же идентификатора мы можем иметь 12 строк для типа AC и 12 для типа FC, он создаст только одну строку для каждого id из-за partion и rowid 1. Я хочу создать 12 строк не только один. – Kerby82

+0

Возможно, я могу добавить месяц для разбиения на разделы, чтобы отделить строки для id и месяца. select id, type, month, value from ( select id, 'AF' as type, month, value, row_number() over (разделение по id, месяц по типу asc) rowid от ppm.dbo.monthly_financials где type = 'AC' или type = 'FC' ) в качестве x, где rowid = 1 – Kerby82

1

Вы кажетесь просто изменить тип. Я думаю, что так оно и есть.

insert into table (ID_PRJ, TYPE, Month, Value) 
Select ID_PRJ, 'AF' Type, Month, Value 
from table where Type in ('AC','FC') 
+0

, если есть 2 строки для AC и FC, это приведет к созданию двух строк, но я хочу только один со значением типа = AC и если не существует с типом = AC, я хочу, чтобы значение от типа = FC – Kerby82

+0

В этом случае у Кости есть правильное решение. Его запрос, используя номера разделов, каждый id_prj рассматривает только AC или FC записи и заказывает их по типу, то есть AC перед FC, если они существуют, а затем он берет значение из верхнего для создания вашей записи. – kubasnack

1

Один довольно простой способ сделать это состоит в использовании полного соединения к производной таблице.

Создать и заполнить образец таблицы (Пожалуйста сохранить нас этот шаг в ваших будущих вопросов):

DECLARE @T AS TABLE 
(
    ID_PRJ int, 
    TYPE char(2), 
    MONTH int, 
    VALUE int 
) 

INSERT INTO @T VALUES 
(1, 'AC', 1, 1000), 
(1, 'FC', 1, 200), 
(3, 'BG', 1, 1000), 
(4, 'FC', 2, 100) 

INSERT ... выберите заявление:

INSERT INTO @T (ID_PRJ, MONTH, TYPE, VALUE) 
SELECT ISNULL(t1.ID_PRJ, t0.ID_PRJ), 
     ISNULL(t1.MONTH, t0.MONTH), 
     'AF', 
     ISNULL(t1.VALUE, t0.VALUE) 
FROM @T t0 
FULL JOIN 
(
    SELECT ID_PRJ, MONTH, TYPE, VALUE 
    FROM @T 
    WHERE TYPE = 'AC' 
) t1 ON t0.ID_PRJ = t1.ID_PRJ 
    AND t0.MONTH = t1.MONTH 
WHERE t0.TYPE IS NULL OR t0.TYPE = 'FC' 

Проверьте вставку:

SELECT ID_PRJ, MONTH, TYPE, VALUE 
FROM @T 

Результаты:

ID_PRJ MONTH TYPE VALUE 
1  1  AC  1000 
1  1  FC  200 
3  1  BG  1000 
4  2  FC  100 
1  1  AF  1000 
4  2  AF  100 
Смежные вопросы