T SQL - Разделить и объединить столбцы - PullRequest
2 голосов
/ 01 сентября 2010

У меня есть проблема, с которой я не сталкивался раньше. У меня есть источник данных Excel, который я загрузил в таблицу SQL, и я пытаюсь превратиться в нечто более разумное. У меня есть столбец A в таблице SQL из Excel, который содержит все 3 поля данных, но мне нужно добавить столбцы, чтобы заменить группы Owner и Stage

Обратите внимание, что пользователь может иметь много этапов, а этап может иметь много проектов. Имена проектов уникальны.

Пример

Моя исходная таблица, которую я импортировал из Excel, содержит 1 столбец

[ColumnA]
Owner: David Jones 
  Stage1: Suspect 
Project A  
Project B 
 Stage2:Qualified Suspect
Project C 
Project D  
Owner: John Doe
  Stage1:Suspect
Project E 
  Stage2:Qualified Suspect
Project F 
Project G 

тогда я хочу, чтобы мои целевые строки выглядели как

[owner]        [stage]                      [project]
David Jones    Stage1:Suspect               ProjectA
David Jones    Stage1:Suspect               ProjectB
David Jones    Stage2:Qualified Suspect     ProjectC
David Jones    Stage1:Qualified Suspect     ProjectD
John Doe       Stage1:Suspect               ProjectE
John Doe       Stage1:Qualified Suspect     ProjectF
John Doe       Stage1:Qualified Suspect     ProjectG

Заранее спасибо

G

Ответы [ 3 ]

3 голосов
/ 01 сентября 2010

Таблица_1 - это таблица SQL, в которую вы бы импортировали свой Excel.

    select * from Table_1
declare @temp varchar(50)
declare @owner varchar(50)
declare @stage varchar(50)
Declare My_Cursor cursor 
For
Select ColumnA
from Table_1

Open My_Cursor
Fetch Next from My_Cursor into @temp
while(@@Fetch_Status=0)
begin
if @temp like 'Owner%'
set @owner = @temp
if @temp like 'Stage%'
set @stage=@temp
if @temp like 'Project%'
begin
select LTRIm(SUBSTRing(@owner,7,LEN(@owner))),@stage,@temp
end
Fetch NExt from My_Cursor into @temp
end
close My_Cursor
deallocate My_Cursor

Выход:

    ColumnA
--------------------------------------------------
Owner: David Jones
Stage1: Suspect
Project A
Project B
Stage2: Qualified Suspect
Project C
Project D
Owner: John Doe
Stage1: Suspect
Project E
Stage2: Qualified Suspect
Project F
Project G

(13 row(s) affected)


-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
David Jones                                        Stage1: Suspect                                    Project A

(1 row(s) affected)


-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
David Jones                                        Stage1: Suspect                                    Project B

(1 row(s) affected)


-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
David Jones                                        Stage2: Qualified Suspect                          Project C

(1 row(s) affected)


-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
David Jones                                        Stage2: Qualified Suspect                          Project D

(1 row(s) affected)


-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
John Doe                                           Stage1: Suspect                                    Project E

(1 row(s) affected)


-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
John Doe                                           Stage2: Qualified Suspect                          Project F

(1 row(s) affected)


-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
John Doe                                           Stage2: Qualified Suspect                          Project G

(1 row(s) affected)

Замените оператор выбора вставкой в ​​вашу таблицу. Дайте мне знать, если это работает.

1 голос
/ 01 сентября 2010

Если я правильно понял, владелец и этап проекта определяются последним владельцем и записями этапа, прочитанными перед строкой проекта.

В результате возникает проблема big - в большинстве реляционных баз данных (включая SQLServer) нельзя гарантировать, что порядок вывода запроса соответствует порядку, в котором строки были введены в таблицу. Другими словами, просто из запроса [ColumnA], есть нет способа сказать, что Проект A принадлежит Дэвиду Джонсу и Stage1: Suspect, а не (например) John Doe и Stage2: Qualified Suspect. 1007 *

Если в исходной таблице базы данных уже нет (по крайней мере) столбца, содержащего номер строки Excel, то такой столбец следует добавить, а таблицу перезагрузить.

Я думаю, что было бы проще изменить электронную таблицу Excel, чтобы получить столбцы владельца, этапа и проекта и загрузить таблицу из измененной электронной таблицы.

1 голос
/ 01 сентября 2010

Предполагая, что ваш единственный столбец уже доступен в таблице базы данных, я могу предложить вам написать динамический sql (хранимая процедура). Создайте новую таблицу с 3 столбцами (владелец, этап, проект), скажем, FinalResult.

Затем вы можете получить каждую строку из вашей таблицы данных Excel с помощью курсора и вставить результаты, основанные на вашей логике, в эту новую таблицу FinalResult.

Наконец, вы можете получить эти результаты из новой таблицы, чтобы получить желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...