2016-11-02 1 views
0

Я пытаюсь вернуть значения из таблицы, чтобы получить 1 строку на покупкуID и возвращает несколько столбцов с именами покупателей и последних.TSQL-запрос для возврата значений из таблицы, в которой есть несколько строк с одинаковым идентификатором в одну строку, но каждое уникальное значение в другом столбце

например у меня есть таблица со следующими данными

| ПокупкаID | FirstName | LastName |
| --------- 1 ------- | ---- Joe ------ | --- Смит ---- |
| --------- 1 ------- | ----- Питер --- | --- Пан ------ |
| --------- 2 ------- | ---- Max ------ | --- силы ---- |
| --------- 2 ------- | ----- Джек ---- | --- Frost ---- |

Я пытаюсь написать запрос, который возвращает значения, как так

| ПокупкаID | Покупатель1FirstName | Buyer1LastName | Buyer2FirstName | Buyer2LastName |
| -------- 1 --------- | ------------ Joe --------- | ---- ---- Смит ---------- | --------- Питер ----------- | -------- Pan --- --------- |
| -------- 2 --------- | ------------- Макс -------- | ----- ---- Сила -------- | --------- Джек ----------- | --------- Frost ---- ------ |

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

Любая помощь была бы потрясающей.

+0

Является ли число столбцов, которые вы хотите, чтобы произвести полностью непредсказуем? Вы хотите, чтобы количество столбцов для каждой строки различалось в зависимости от количества покупателей для соответствующего продукта? Почему вы хотите сделать это в базе данных? – HABO

+0

Максимальное количество покупателей будет 4, поэтому для любой строки, где есть менее 4 покупателей, эти столбцы будут равны нулю. Целью является создание источника данных для слияния слияния/слияния документов, где результаты должны быть от 1 до 1. Таким образом, каждая строка будет записью покупки, которую мы могли бы использовать для вставки в расчетный документ и т. Д. Я уже создал просмотр остальной части контента. Его единственные имена покупателей, с которыми я сталкиваюсь. – recycledplastyk

+0

Поскольку вы делаете это для форматирования расчетного документа, было бы целесообразно обработать его в коде приложения, который генерирует документ. Такое форматирование, как правило, лучше обрабатывается в приложении вместо базы данных. – HABO

ответ

0

Вы можете использовать ROW_NUMBER как ниже:

DECLARE @Tbl TABLE (PurchaseID INT, FirstName VARCHAR(50), LastName VARCHAR(50)) 
INSERT INTO @Tbl   
VALUES 
(1, 'Joe', 'Smith'), 
(1, 'Peter', 'Pan'), 
(2, 'Max', 'Power'), 
(2, 'Jack', 'Frost'), 
(2, 'Opss', 'Sspo') 


;WITH CTE 
AS 
(
    SELECT 
     *, ROW_NUMBER() OVER (PARTITION BY PurchaseID ORDER BY PurchaseID) RowId 
    FROM @Tbl 
) 

SELECT 
    A.PurchaseID, 
    MIN(CASE WHEN A.RowId = 1 THEN A.FirstName END) Buyer1FirstName, 
    MIN(CASE WHEN A.RowId = 1 THEN A.LastName END) Buyer1LastName , 
    MIN(CASE WHEN A.RowId = 2 THEN A.FirstName END) Buyer2FirstName , 
    MIN(CASE WHEN A.RowId = 2 THEN A.LastName END)Buyer2LastName, 
    MIN(CASE WHEN A.RowId = 3 THEN A.FirstName END) Buyer3FirstName , 
    MIN(CASE WHEN A.RowId = 3 THEN A.LastName END)Buyer3LastName, 
    MIN(CASE WHEN A.RowId = 4 THEN A.FirstName END) Buyer4FirstName , 
    MIN(CASE WHEN A.RowId = 4 THEN A.LastName END)Buyer4LastName 
FROM 
    CTE A 
GROUP BY 
    A.PurchaseID  

Результат:

PurchaseID Buyer1FirstName  Buyer1LastName  Buyer2FirstName  Buyer2LastName  Buyer3FirstName  Buyer3LastName Buyer4FirstName  Buyer4LastName 
----------- ------------------- -------------------- -------------------- ------------------ ------------------- ----------------- ------------------- -------------- 
1   Joe     Smith    Peter    Pan    NULL    NULL    NULL    NULL 
2   Max     Power    Jack     Frost    Opss    Sspo    NULL    NULL 
+1

Спасибо NEER! Это именно то, что мне нужно. Очень признателен. – recycledplastyk

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

  • Нет связанных вопросов^_^