[英]SQL Combine Multiple rows into Multiple Columns
我一直在這里和整個網絡中查看另一個示例,但我只是不能全神貫注於如何執行此操作。
我有一個網站,我在其中將有關產品的每條信息拉到一張表中進行查看,然后加載到csv / excel工作表中。
它合並了7個表,並按以下方式將它們吐出:(剪掉表的其余部分以使其易於閱讀)
ID Filter FilterValue ParentItem ItemTitle
---------------------------------------------------------------
7 15 B LE0001 LB PALETTE WHITE 127MM
7 16 Yes LE0001 LB PALETTE WHITE 127MM
7 18 Yes LE0001 LB PALETTE WHITE 127MM
7 20 Std LE0001 LB PALETTE WHITE 127MM
7 22 Yes LE0001 LB PALETTE WHITE 127MM
7 23 Polyester LE0001 LB PALETTE WHITE 127MM
7 25 White LE0001 LB PALETTE WHITE 127MM
7 26 127mm LE0001 LB PALETTE WHITE 127MM
使用此代碼(顯示的當前列是tblprod.prodID,prodval.valueColumn,prodval.valueKey,tblprod.parentSKU和tblprod.prodTitle)
SELECT
tblprod.prodID as ID, prodval.valueColumn as Filter,
prodval.valueKey as FilterValue, tblprod.prodSKU as Item,
tblprod.parentSKU as ParentItem, tblprod.prodTitle as ItemTitle,
tblprod.prodConsumerTitle as ConsumerTitle, tblprod.itemGroup as ItemGroup,
tblprod.itemFamily as ItemFamily, tblprod.cutLengthCode as LengthCode,
tblprod.prodPackSize as PackSize, tblprod.prodMultQty as MultipleQuantity,
tblsu.ImportCode as SalesUnit, tblprod.prodPrice as SalesPrice ,
tblprod.qtyDependent as QtyDep, tblprod.qtyTarget as Limit,
tblprod.targetPrice as Price, tblprod.prodLegacyImage as MainImage,
catprod.IsPrimary as SafetyinMind, featlists.prodList as NEWLimited
FROM
[Eclipse].[dbo].[tbl_Product] AS tblprod
LEFT JOIN
[Database].[dbo].[tbl_SalesUnit] AS tblsu ON tblsu.ID = tblprod.saleUnit
LEFT JOIN
[Database].[dbo].[tbl_ProductFilter] AS prodfil ON prodfil.ProdID = tblprod.prodID
LEFT JOIN
[Database].[dbo].[tbl_ProductFilterValues] AS prodval ON prodval.valueID = prodfil.valueID
LEFT JOIN
[Database].[dbo].[tbl_ProductstoFeaturedLists] AS prodlists ON prodlists.prodID = tblprod.prodID
LEFT JOIN
[Database].[dbo].[tbl_FeaturedLists] AS featlists ON featlists.ID = prodlists.listID
LEFT JOIN
[Database].[dbo].[tbl_CategoryProducts] AS catprod ON catprod.prodID = tblprod.prodID
重要的部分是我想合並相同ID的行,從Filter列(prodval.valueColumn)中創建列標題,並用其對應的值(prodval.valueKey)填充它們
我的問題是我只是不知道如何完成此操作,在閱讀其他答案時我迷失了;其次,有19個過濾器,並不是每個產品都具有全部過濾器(如您所見,上述產品有8個),我不確定如果這樣做會導致我遇到任何問題。 過濾器的范圍從15到33,所有過濾器都可以使用,但只能用於不同的產品。
表格示例如下所示。
ID ParentItem ItemTitle Filter 15 Filter 16 Filter 17 Filter 18 Filter 19 Filter 20 Filter...
7 LE0001 LB PALETTE WHITE 127MM B YES YES Std
如果有人能提供任何幫助,我將不勝感激,我將無能為力。
抱歉忘了提及我正在使用SQL Server Management Studio
請嘗試以下解決方案:
DECLARE @Columns VARCHAR(max)
;WITH cte
AS (SELECT Min(Filter) minimum,
Max(Filter) maximum
FROM yourtable)
SELECT @Columns = Stuff((SELECT ',' + '[ ' + CONVERT(VARCHAR(30), number, 121) + ']'
FROM master..spt_values N
WHERE EXISTS (SELECT 1
FROM cte
WHERE n.number BETWEEN cte.minimum AND cte.maximum)
AND type = 'P'
FOR XML PATH('')), 1, 1, '')
DECLARE @sql NVARCHAR(max)= 'select [ID],[ParentItem],[ItemTitle],' + @Columns +
' from (select [ID],[ParentItem],[ItemTitle],[Filter],[FilterValue] from yourtable) t
pivot
(MAx(FilterValue)
FOR Filter in(' + @Columns + ')
)as pvt'
EXEC sp_executesql
@sql
使用PIVOT獲得結果。 提琴手演示
CREATE TABLE #Sample
(
ID INT,
Filter INT,
FilterValue VARCHAR(100),
ParentItem VARCHAR(100),
ItemTitle VARCHAR(100)
)
INSERT INTO #Sample VALUES(7, 15,'B', 'LE0001','LB PALETTE WHITE 127MM')
INSERT INTO #Sample VALUES(7, 16,'Yes', 'LE0001','LB PALETTE WHITE 127MM')
INSERT INTO #Sample VALUES(7, 18,'Yes', 'LE0001','LB PALETTE WHITE 127MM')
INSERT INTO #Sample VALUES(7, 20,'Std', 'LE0001','LB PALETTE WHITE 127MM')
INSERT INTO #Sample VALUES(7, 22,'Yes', 'LE0001','LB PALETTE WHITE 127MM')
INSERT INTO #Sample VALUES(7, 23,'Polyester', 'LE0001','LB PALETTE WHITE 127MM')
INSERT INTO #Sample VALUES(7, 25,'White','LE0001','LB PALETTE WHITE 127MM')
INSERT INTO #Sample VALUES(7, 26,'127mm','LE0001','LB PALETTE WHITE 127MM')
SELECT P.ID,P.ParentItem, P.ItemTitle,
Min(Filter15) Filter15,
Min(Filter16) Filter16 ,
Min(Filter17)Filter17,
Min(Filter18)Filter18,
Min(Filter19)Filter19,
Min(Filter20)Filter20,
Min(Filter21)Filter21,
Min(Filter22)Filter22,
Min(Filter23)Filter23,
Min(Filter24)Filter24,
Min(Filter25)Filter25,
Min(Filter26)Filter26,
Min(Filter27)Filter27,
Min(Filter28)Filter28,
Min(Filter29)Filter29,
Min(Filter30)Filter30,
Min(Filter31)Filter31,
Min(Filter32)Filter32,
Min(Filter33)Filter33
FROM
(SELECT *,
'Filter' + CONVERT(VARCHAR(30), Filter) AS Filter_A
FROM #Sample
) AS A
PIVOT (Min(A.FilterValue) FOR Filter_A in
(Filter15,Filter16,Filter17,Filter18,Filter19,
Filter20,Filter21,Filter22,Filter23,Filter24,
Filter25,Filter26,Filter27,Filter28,Filter29,
Filter30,Filter31,Filter32,Filter33)) AS P
GROUP BY P.ID,P.ParentItem, P.ItemTitle
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.