簡體   English   中英

根據另一張表中的列值轉換一張表中的行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM