[英]Transposing rows from one table based on column values in another table
我在[此處]提出了類似的問題: 將具有相同ID的行組轉置到另一個表中,但我不想為每個屬性名稱寫出每一行。 我希望能夠從TABLE1的一列中獲取行(比如說有50個唯一的行),並將它們有效地轉置到TABLE2中。
這是一列ATTR_NME(屬性名稱)表的小示例:
ID ATTR_NME ATTR_VAL
1000 UPC 00015582981001
1000 Price 15.99
1000 Brand Oreo
1005 UPC 00038762291010
1005 Price 12.50
1005 Brand Sargento
1010 UPC 00198872499000
1010 Price 4.99
1010 Brand Olay
因此,ID,UPC,價格和品牌應該是它們自己的列,並將ATTR_VAL作為數據行。 這是我的問題與上一個問題的區別:假設我有一個包含50個不同ATTR_NME的表,我想使用具有所有這些屬性名稱的那列數據來創建新的轉置表,而不必為該表寫以下50次不同的屬性:
MAX(CASE WHEN ATTR_NME = 'UPC' THEN ATTR_VAL END) AS UPC
我試圖為ATTR_NME列中的行聲明一個變量,如下所示:
DECLARE @itm varchar(100);
SET @itm = (
SELECT ATTR_NME
FROM TABLE1
);
SELECT ID,
MAX(CASE WHEN ATTR_NME = @itm THEN ATTR_VAL END) AS [@itm]
FROM TABLE1
GROUP BY ID;
但是,由於多種原因,這種方法行不通。 有人希望我在我設置@itm的ATTR_NME周圍包裝一個聚合函數(但后來我只有一個屬性名)。 它也沒有按我想要的方式標記/命名列。 甚至有可能做我想做的事嗎? 如果是這樣,怎么辦? TIA。
您是在談論Pivot
嗎?
如果需要pivot
此表,則無法避免在下面的查詢中放置ATTR_NME
50次(請參閱注釋)
WITH A
AS
(
SELECT '1000' as ID, 'UPC ' as ATTR_NME, '00015582981001' as ATTR_VAL
UNION ALL SELECT '1000' as ID, 'Price' as ATTR_NME, '15.99 ' as ATTR_VAL
UNION ALL SELECT '1000' as ID, 'Brand' as ATTR_NME, 'Oreo ' as ATTR_VAL
UNION ALL SELECT '1005' as ID, 'UPC ' as ATTR_NME, '00038762291010' as ATTR_VAL
UNION ALL SELECT '1005' as ID, 'Price' as ATTR_NME, '12.50 ' as ATTR_VAL
UNION ALL SELECT '1005' as ID, 'Brand' as ATTR_NME, 'Sargento ' as ATTR_VAL
UNION ALL SELECT '1010' as ID, 'UPC ' as ATTR_NME, '00198872499000' as ATTR_VAL
UNION ALL SELECT '1010' as ID, 'Price' as ATTR_NME, '4.99 ' as ATTR_VAL
UNION ALL SELECT '1010' as ID, 'Brand' as ATTR_NME, 'Olay ' as ATTR_VAL
)
SELECT *
FROM A
PIVOT
(MAX(ATTR_VAL) FOR ATTR_NME in ([Price],[Brand],[UPC]) ) -- here you need to put all the 50 ATTR_NAME
as PIVOTTABLE
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.