Eu tenho um procedimento armazenado
SELECT [ShipWorks].[dbo].[OrderItem].[Code] AS Code,
CASE WHEN (LEN(ISNULL(MAX([ShipWorks].[dbo].[OrderItem].[Location]),'')) = 1)
THEN MAX([ShipWorks].[dbo].[OrderItem].[Location])
ELSE MAX([Picklist].[dbo].[ItemData].[InventoryLocation])
END AS Location,
SUM([ShipWorks].[dbo].[OrderItem].[Quantity]) AS Quantity,
MAX(LEFT([ShipWorks].[dbo].[Store].[StoreName], 1)) AS Store
FROM [ShipWorks].[dbo].[OrderItem]
INNER JOIN [ShipWorks].[dbo].[Order] ON [ShipWorks].[dbo].[OrderItem].[OrderID] = [ShipWorks].[dbo].[Order].[OrderID]
INNER JOIN [ShipWorks].[dbo].[Store] ON [ShipWorks].[dbo].[Order].[StoreID] = [ShipWorks].[dbo].[Store].[StoreID]
LEFT JOIN [ShipWorks].[dbo].[AmazonOrder] ON [ShipWorks].[dbo].[AmazonOrder].[OrderID] = [ShipWorks].[dbo].[Order].[OrderID]
LEFT JOIN [Picklist].[dbo].[ItemData] ON [Picklist].[dbo].[ItemData].[InventoryNumber] = [ShipWorks].[dbo].[OrderItem].[Code] OR
[Picklist].[dbo].[ItemData].[MediaCreator] = [OrderItem].[Code]
WHERE [ShipWorks].[dbo] [Order].[LocalStatus] = 'Recently Downloaded' AND ([ShipWorks].[dbo].[AmazonOrder].[FulfillmentChannel] = 2 OR [ShipWorks].[dbo].[Store].[StoreName] <> 'Amazon')
GROUP BY [ShipWorks].[dbo].[OrderItem].[Code]
ORDER BY Location
que retorna isso:
Code Location Quantity Store
L698-W-EA NULL 2 A
L82009-EA A1K2, A1N2, C4Y3, CBP2 2 A
L80401-A-EA A1S2, SHIP, R2F1, CBP5, BRP, BRP1-20 17 A
CWD2132W-BOX-25PK A-AISLE 1 M
GM22660003-EA B1K2 1 M
Desejo dividir a coluna Localização em várias colunas.
Code loc1 loc2 loc3 loc4 loc5 loc6 Quantity Store
L698-W-EA NULL 2 A
L82009-EA A1K2, A1N2, C4Y3, CBP2 2 A
L80401-A-EA A1S2, SHIP, R2F1, CBP5, BRP, BRP1-20 17 A
CWD2132W-BOX-25PK A-AI 1 M
GM22660003-EA B1K2 1 M
Eu encontrei esta resposta, mas era para postgresql . Também isso , mas retorna uma tabela com várias linhas e você pode selecionar o 1 superior, mas quero todos os resultados e não tenho certeza de como usar o tvf Split(string, ',') no procedimento armazenado para obter o conjunto de resultados que eu quero?
Esta instrução select resulta em um erro: 'Não é possível executar uma função de agregação em uma expressão que contém uma agregação ou uma subconsulta.'
SELECT [ShipWorks].[dbo].[OrderItem].[Code] AS Code,
CASE WHEN (LEN(ISNULL(MAX([ShipWorks].[dbo].[OrderItem].[Location]),'')) = 1)
THEN MAX((SELECT TOP 1 i.* FROM dbo.Split([ShipWorks].[dbo].[OrderItem].[Location], ',') as i))
ELSE MAX((SELECT TOP 1 i.* FROM dbo.Split([ShipWorks].[dbo].[OrderItem].[Location], ',') as i))
END AS Location,
SUM([ShipWorks].[dbo].[OrderItem].[Quantity]) AS Quantity,
MAX(LEFT([ShipWorks].[dbo].[Store].[StoreName], 1)) AS Store
FROM [ShipWorks].[dbo].[OrderItem]
INNER JOIN [ShipWorks].[dbo].[Order] ON [ShipWorks].[dbo].[OrderItem].[OrderID] = [ShipWorks].[dbo].[Order].[OrderID]
INNER JOIN [ShipWorks].[dbo].[Store] ON [ShipWorks].[dbo].[Order].[StoreID] = [ShipWorks].[dbo].[Store].[StoreID]
LEFT JOIN [ShipWorks].[dbo].[AmazonOrder] ON [ShipWorks].[dbo].[AmazonOrder].[OrderID] = [ShipWorks].[dbo].[Order].[OrderID]
LEFT JOIN [Picklist].[dbo].[ItemData] ON [Picklist].[dbo].[ItemData].[InventoryNumber] = [ShipWorks].[dbo].[OrderItem].[Code] OR
[Picklist].[dbo].[ItemData].[MediaCreator] = [OrderItem].[Code]
WHERE [Order].[LocalStatus] = 'Recently Downloaded' AND ([ShipWorks].[dbo].[AmazonOrder].[FulfillmentChannel] = 2 OR [ShipWorks].[dbo].[Store].[StoreName] <> 'Amazon')
GROUP BY [ShipWorks].[dbo].[OrderItem].[Code]
ORDER BY Location
Fazendo uso do Tally-Ho de Jeff Moden! Divisor CSV daqui :
Podemos codificar a solução como uma aplicação contra a função de Jeff e um pivô da seguinte forma:
rendendo isso: