Существует ли команда MSSQL для объединения большого количества данных в одну строку из общего ключа? - PullRequest
2 голосов
/ 05 октября 2010

У меня есть несколько таблиц, заполненных такой информацией:

jobDetails:
+-----------+------+---------+
| JOBNUMBER | DATA | KEY     |
+-----------+------+---------+
|  6015425  | .... | COLOUR  |
+-----------+------+---------+
|  6015425  | .... | SIZE    |
+-----------+------+---------+
|  6015425  | .... | WEIGHT  |
+-----------+------+---------+
|  6015425  | .... | ADDRESS |
+-----------+------+---------+

Строка .... - это данные, которые я хочу.

Есть ли запрос MSSQL, который я могу использовать, чтобы вернуть эту информацию в одну строку? как это:

Jobnumber, Colour, Size, Weight, Address

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

Ответы [ 4 ]

1 голос
/ 05 октября 2010

используйте соединение:

SELECT
    TableA.Col1, TableA.Col2, TableB.Col1
    FROM TableA
        INNER JOIN TableB ON TableA.Col_X=TableB.Col_Z

для вашего примера:

SELECT
    a.JobNumber
        ,a.Data AS Colour
        ,b.Data AS Size
        ,c.Data AS Weight
        ,d.Data AS Address
    FROM JobDetails                 a
        LEFT OUTER JOIN JobDetails  b ON a.JobNumber=b.Jobnumber AND b.Key='SIZE'
        LEFT OUTER JOIN JobDetails  c ON a.JobNumber=c.Jobnumber AND c.Key='WEIGHT'
        LEFT OUTER JOIN JobDetails  d ON a.JobNumber=d.Jobnumber AND d.Key='ADDRESS'
    WHERE a.Key='COLOUR'
0 голосов
/ 25 октября 2010

Поместить все столбцы UR в таблицу

и затем объединить их в CSV (переменная запятая), используя

SELECT @COLUMNS = COALESCE (@COLUMNS + ',' + CAST (ГОЛОВА В КАЧЕСТВЕ VARCHAR), АКТЕРЫ (ГОЛОВКИ В КАЧЕСТВЕ VARCHAR)) ИЗ ТАБЛИЦЫ

ТОГДА СЧИТАЙТЕ ЧИСЛО СТРОК НА КАЖДЫЙ ID

КАК 5 СТРОК ДЛЯ 6015425

СОЗДАТЬ СТОЛЭТО РАСЧЕТ КАК

СОЗДАТЬ ТЕМП. ТАБЛИЦЫ (ID INT)

SET @COUNT = (ВЫБРАТЬ СЧЕТ (*) ИЗ ТАБЛИЦЫ)

WHILE @COUNT> = 0 НАЧАТЬ

ALTER TABKE ADD COLUMNSNAME END

ТОГДА ИСПОЛЬЗУЙТЕ DE COMMA РАЗДЕЛИТЬ, ЧТОБЫ ПОСТАВИТЬ ATVE CSV В СТОЛБЦЫ

КАК

DECLARE @S VARCHAR (8000), @VARCHAR ДАННЫХ (8000) - УДАЛИТЬ ТАБЛИЦУ #NORMALISEDTABLE - СОЗДАТЬ ТАБЛИЦУ #NORMALISEDTABLE (HEADS NVARCHAR (200)) ВЫБРАТЬ @ S = '', В КОТОРЫМ ВЫБИРАЕТСЯ (ВЫБРАТЬ * ИЗ #HEADSCOMMA ГДЕ ГЛАВЫ> @S) НАЧАТЬ ВЫБРАТЬ @ОТ #HEADSCOMMA ГДЕ ГОЛОВКИ> @S ПЕЧАТЬ @S SELECT @DATA = '' '' + ЗАМЕНА (@S, ',', '' ',' '') + '' '' ПЕЧАТЬ @DATA INSERT INTO #TEMP EXEC(«ВЫБРАТЬ» + @ ДАННЫЕ) КОНЕЦ

0 голосов
/ 22 октября 2010

Это на самом деле очень мощный дизайн схемы.Это позволяет очень эффективно определять новые свойства объектов.Это похоже на то, как динамические языки определяют свойства и методы.

С учетом сказанного, SQL Server имеет ограниченную поддержку для этого типа схемы.Если ваши свойства установлены во время разработки (т. Е. Каждая сущность будет иметь только 4 свойства), то вы можете использовать функциональность PIVOT.Однако, если количество свойств изменится (что является точкой этого типа схемы), то вам нужно другое решение.Возможны следующие варианты:

  1. Использовать динамический SQL с функцией PIVOT
  2. Выполнить преобразование на клиенте
  3. Использовать XML / XSLT на сервере .

Мои личные предпочтения обычно # 3, если только окончательное приложение не было разработано для # 2.

Помогает ли это?

Эрик

0 голосов
/ 05 октября 2010

Нет ничего принципиально неправильного в дизайне;это EAV .Это довольно хорошее приложение PIVOT .Поскольку вы имеете дело со строками, используйте MIN или MAX в качестве совокупности, которая требуется для PIVOT .

SELECT  *
FROM    ( SELECT  *
          FROM    JobDetails) data PIVOT (MIN([DATA]) FOR [KEY] 
                                  IN ([COLOUR], [SIZE], [WEIGHT], [ADDRESS]) pvt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...