2016-05-02 7 views
1

Мой вопрос: как вставить из таблицы1 в таблицу2?Выполнение процедуры в SQL Server

Table1 является:

Number Category Value 
10  1  1000 
10  2  5000 
12  3  4000 

Table2 является:

number Category1 Category2 Category3 
10  1000  5000  NULL 
12   NULL  NULL  4000 

мне нужно сделать это (мои категории есть предел).

Мое решение: Я создал хранимую процедуру, которая получает параметр и вставляет в table2, как это:

CREATE proc [dbo].[UpdateMemberActivityCategory] 
    (@Number nchar(11), 
    @Value int, 
    @Type int) 
AS 
BEGIN 
    IF (NOT EXISTS(SELECT * FROM MemberActivityCategory WHERE ([email protected]))) 
    BEGIN 
     INSERT INTO MemberActivityCategory(Number) 
     VALUES(@Number); 

     IF(@Type = 2) 
     BEGIN 
      UPDATE MemberActivityCategory 
      SET ArtAndCulture = @Value 
      WHERE (Number = @Number)  
     END 

     IF(@Type = 3) 
     BEGIN 
      UPDATE MemberActivityCategory 
      SET Learn = @Value 
      WHERE (Number = @Number)   
     END 

     IF(@Type = 4) 
     BEGIN 
      UPDATE MemberActivityCategory 
      SET Business = @Value 
      WHERE (Number = @Number)   
     END 
END 

и я называю это procedire так:

select *, myProc(t.Number,1,t.category) 
from myTable t 

мое решение неправильно ? И что это лучший способ сделать это?

+0

Вы можете посмотреть на 'PIVOT'. https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx –

ответ

0

Вы можете использовать a pivot table:

WITH cte AS (
    SELECT * FROM (
     VALUES 
      (10, 1, 1000), 
      (10, 2, 5000), 
      (12, 3, 4000) 
     ) AS a (Number, Category, Value) 
) 

SELECT Number AS Number, [1], [2], [3] 
FROM cte 
PIVOT 
(
    SUM(Value) 
    FOR Category IN ([1], [2], [3]) 
) AS PivotTable; 

Результат:

10 1000 5000 NULL 
12 NULL NULL 4000 
0

Вы не можете выполнить хранимую процедуру внутри запроса выбора. Попробуйте приведенный ниже запрос, чтобы вставить данные с table1 в table2.

INSERT INTO table2(number, Category1, Category2, Category3) 
SELECT DISTINCT Number 
     ,(SELECT TOP 1 t1.Value FROM table1 t1 
      WHERE t1.Number = t.Number and t1.Category = 1) 
     ,(SELECT TOP 1 t1.Value FROM table1 t1 
      WHERE t1.Number = t.Number and t1.Category = 2) 
     ,(SELECT TOP 1 t1.Value FROM table1 t1 
      WHERE t1.Number = t.Number and t1.Category = 3) 
FROM table1 t 
+0

спасибо abdul, но я даю ошибку: «subQuery возвращает более 1 значения. Это не разрешено, если subQuery следует =,! =, ... " – Parike

+0

Это означает, что есть некоторая повторяющаяся таблица1 (Число, Категория). Вы можете удалить дубликат, или вы можете использовать TOP 1 в подзапросе (plz проверить измененный ответ). –

Смежные вопросы