SQL - перемещение нескольких строк данных в одну строку - PullRequest
0 голосов
/ 12 августа 2010

Я пытаюсь взять несколько строк данных из столбца и вставить их в одну ячейку.Вот что я имею ниже:

+++HouseNumber+++++++CustomerType+++
+      1         +    Residential  +
+      2         +    Commercial   +
+      2         +    Residential  +
+      3         +    Residential  +
++++++++++++++++++++++++++++++++++++

И мне нужно получить это что-то похожее на это:

+++HouseNumber+++++++CustomerType+++++++++++++++
+      1         +    Residential              +
+      2         +    Commercial Residential   +
+      3         +    Residential              +
++++++++++++++++++++++++++++++++++++++++++++++++

Я понимаю, что это против нормализации;тем не менее, мне просто нужно, чтобы эти данные отображались таким образом, чтобы в дальнейшем их было легче просматривать, и на конкретную ячейку больше никогда не будут ссылаться какие-либо отдельные элементы в ней.

Я попытался сделать это, создав дватаблиц, одна с tempCustomerType, а другая с полем customerType или по умолчанию равной NULL, а затем обновляется с использованием следующего:

UPDATE CustomerIdentifier
SET CustomerIdentifier.CustomerType = TempTable2.CustomerTypeTemp + CustomerIdentifier.CustomerType
FROM CustomerIdentifier
INNER JOIN TempTable2
ON CustomerIdentifier.SUB_ACCT_NO_OCI = TempTable2.SUB_ACCT_NO_OCI

Однако после этого каждое поле все еще было равно нулю.Так есть ли шанс, что кто-нибудь здесь может мне помочь?Спасибо!

Также, если есть способ сделать это без создания второй таблицы, это было бы также здорово.

Ответы [ 3 ]

1 голос
/ 12 августа 2010

NULL + 1 в T / SQL всегда будет возвращать ноль;

Решения для вашей проблемы описаны здесь

0 голосов
/ 12 августа 2010

Ниже приведено более простое решение проблемы.К сожалению, не проверено на моей машине (установка сервера sql borked), я завтра протестирую и при необходимости отредактирую ответ.Это будет работать с SQL 2005 и выше и не требует каких-либо UDF или CLR.Это также довольно быстро тоже.

/* Test Table & Data */
DECLARE @TestTable TABLE
(
HouseNumber int,
CustomerType varchar(12)
)
;
INSERT @TestTable
SELECT 1, 'Residential' UNION ALL
SELECT 2, 'Commercial'  UNION ALL
SELECT 2, 'Residential' UNION ALL
SELECT 3, 'Residential' UNION ALL
;
/* CTE to construct the concatenated data. */
WITH ConcatData (HouseNumber,CustomerType) as
(
SELECT HouseNumber,STUFF((SELECT ', ' + CustomerType
FROM @TestTable TT2
FOR XML PATH ('')
WHERE TT2.HouseNumber = TT1.HouseNumber),1,2,'')
FROM TestTable TT1
GROUP BY TT1.HouseNumber
)
/* Update the test table using the concatenated data from the CTE - joining on HouseNumber */
UPDATE trg
SET CustomerType = src.CustomerType
FROM @TestTable trg
INNER JOIN ConcatData src on src.HouseNumber = trg.HouseNumber
0 голосов
/ 12 августа 2010

Мы реализовали нашу собственную агрегатную функцию CLR, как описано здесь , затем вы можете написать:

DECLARE @test TABLE (
    HouseNumber INT,
    CustomerType VARCHAR(16)
)

INSERT INTO @test
      SELECT 1, 'Residential'
UNION SELECT 2, 'Commercial'
UNION SELECT 2, 'Residential'
UNION SELECT 3, 'Residential'

SELECT HouseNumber, dbo.Concatenate(CustomerType)
FROM @test
GROUP BY HouseNumber
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...