Как я могу пролить столбец varchar на разные столбцы - PullRequest
0 голосов
/ 11 ноября 2019

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

orderline_ID Field_ID Value
--------------------------------
1            1        50
1            2        today
1            3        green
2            1        80
2            2        next week
2            3        60



Я хочу, чтобы эти данные были отсортированы следующим образом:

Orderline_ID  1        2          3
----------------------------------------
1             50       today      green
2             80       next week  60

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

Но код, который я написал, выглядит как

Orderline_ID  1        2          3
-----------------------------------------
1             50       NULL       NULL
1             NULL     today      NULL
1             NULL     NULL       green
2             80       NULL       NULL
2             NULL     next week  NULL
2             NULL     NULL       60

, и когда я сортирую по Orderline_ID, это приводит к ошибке.

Код, который я использовал:

SELECT        
    fldVerkoopOrderRegelID,
    (SELECT VOG.fldWaarde
     WHERE (VOG.fldVeldNummer = 1) AND (VOG.fldWaarde IS NOT NULL)) AS [aantal vaten],
    (SELECT VOG.fldWaarde
     WHERE (VOG.fldVeldNummer = 2) AND (VOG.fldWaarde IS NOT NULL)) AS [Vat nett0],
    (SELECT VOG.fldWaarde
     WHERE (VOG.fldVeldNummer = 3) AND (VOG.fldWaarde IS NOT NULL)) AS [Vat bruto],
    (SELECT VOG.fldWaarde
     WHERE (VOG.fldVeldNummer = 4) AND (VOG.fldWaarde IS NOT NULL)) AS [cust product code],
    (SELECT VOG.fldWaarde
     WHERE (VOG.fldVeldNummer = 5) AND (VOG.fldWaarde IS NOT NULL)) AS [extra text],
    (SELECT VOG.fldWaarde
     WHERE (VOG.fldVeldNummer = 6) AND (VOG.fldWaarde IS NOT NULL)) AS [HS code]
FROM       
    dbo.tblVerkoopOrderIngaveGegeven AS VOG
WHERE        
    (fldVerkoopOrderRegelID IS NOT NULL) 

Ответы [ 4 ]

0 голосов
/ 11 ноября 2019

Использование PIVOT также является способом достижения этого.

SELECT orderline_ID, 
 [1] AS [total barrels],
 [2] AS [vat netto],
 [3] AS [vat bruto]
FROM
(
   SELECT orderline_ID, Field_ID, [Value]
   FROM YourSaleOrderInputDataTable
   WHERE Field_ID IN (1, 2, 3) -- optional criteria
) AS src
PIVOT
(
   MAX([Value])
   FOR Field_ID IN ([1], [2], [3])
) AS pvt
ORDER BY orderline_ID;
0 голосов
/ 11 ноября 2019

Вы можете выбрать отдельные идентификаторы уникальных ордеров, а затем выполнить левое объединение для трех таблиц, каждая из которых имеет нужный вам столбец, т.е. 1,2,3

DECLARE @Orders TABLE (
    [Orderline_ID] INT,
    [Field_ID] INT,
    [Value] VARCHAR(MAX)
)

INSERT INTO @Orders SELECT 1, 1, '50'
INSERT INTO @Orders SELECT 1, 2, 'today'
INSERT INTO @Orders SELECT 1, 3, 'green'
INSERT INTO @Orders SELECT 2, 1, '80'
INSERT INTO @Orders SELECT 2, 2, 'next week'
INSERT INTO @Orders SELECT 2, 3, '60'

SELECT
    [T].[Orderline_ID],
    [T1].[C1],
    [T2].[C2],
    [T3].[C3]
FROM 
    (SELECT DISTINCT [Orderline_ID] FROM @Orders ) AS [T]
    LEFT JOIN (SELECT [Orderline_ID], [Field_ID], [Value] AS [C1] FROM @Orders) AS [T1] ON ([T].[Orderline_ID] = [T1].[Orderline_ID] AND [T1].[Field_ID] = 1)
    LEFT JOIN (SELECT [Orderline_ID], [Field_ID], [Value] AS [C2] FROM @Orders) AS [T2] ON ([T].[Orderline_ID] = [T2].[Orderline_ID] AND [T2].[Field_ID] = 2)
    LEFT JOIN (SELECT [Orderline_ID], [Field_ID], [Value] AS [C3] FROM @Orders) AS [T3] ON ([T].[Orderline_ID] = [T3].[Orderline_ID] AND [T3].[Field_ID] = 3)

enter image description here

0 голосов
/ 11 ноября 2019

Условное агрегирование - одно из самых простых решений:

SELECT orderline_ID
     , MIN(CASE WHEN Field_ID = 1 THEN Value END) AS [1]
     , MIN(CASE WHEN Field_ID = 2 THEN Value END) AS [2]
     , MIN(CASE WHEN Field_ID = 3 THEN Value END) AS [3]
FROM yourtable
GROUP BY orderline_ID
0 голосов
/ 11 ноября 2019

это достижимо при использовании left join.

select t1.orderline_id, t1.Value, t2.Value, t3.Value
from tblVerkoopOrderIngaveGegeven t1
left join tblVerkoopOrderIngaveGegeven  t2 on t2.orderline_id = t1.orderline_id and t2.field_id = 2
left join tblVerkoopOrderIngaveGegeven  t3 on t3.orderline_id = t1.orderline_id and t3.field_id = 3
where t1.field_id = 1
...