0

これまでお世話になりました。前スレの続きです。

SQL でデータをピボットする方法

私がやりたいことは、結果のフィールドの 1 つ (PROJECT_ID としましょう) の値を置き換えて、このようなことを行うことです。これが単純なものであることを願っています。しかし、このプロジェクトにはまだまだあります。

select oc.ncr_no,
  max(case when OC.LU_NAME = 'Project' then OC.KEY_REF end) PROJECT_ID,
  max(case when OC.LU_NAME = 'SupplierInfo' then OC.KEY_REF end) SUPPLIER_ID,
  max(case when OC.LU_NAME = 'PurchaseOrder' then OC.KEY_REF end) ORDER_NO,
  max(case when OC.LU_NAME = 'PurchaseReceipt' then OC.KEY_REF end) PURCHASE_RECEIPT,
  max(case when OC.LU_NAME = 'InventoryPart' then OC.KEY_REF end) INVENTORY_PART,
  replace(PROJECT_ID,'PROJECT_ID=','') as PROJECT_ID
from OC
group by oc.ncr_no

このスキーマを例に使用しました (SQL Fiddle から取得)。残念ながら保存方法がわかりません。

CREATE TABLE OC 
(
  [NCR_NO] int, 
  [LU_NAME] varchar(15), 
  [KEY_REF] varchar(33)
);

INSERT INTO OC ([NCR_NO], [LU_NAME], [KEY_REF])
VALUES
    (100001, 'Project', 'PROJECT_ID=PROJECT1^'),
    (100001, 'SupplierInfo', 'SUPPLIER_ID=UNIQUESUPPLIERNUMBER^'),
    (100001, 'PurchaseOrder', 'ORDER_NO=UNIQUEORDERNO^'),
    (100196, 'PurchaseReceipt', 'UNIQUE PURCHASE RECEIPT'),
    (100511, 'InventoryPart', 'CONTRACT=UNIQUECONTRACTNO');
4

1 に答える 1

0

=eachの の前にあるものをすべて削除するかどうかは明確ではありませんKEY_REF。その場合は、次を使用できます。

select ncr_no,
  max(case when LU_NAME = 'Project' then KEY_REF end) Project,
  max(case when LU_NAME = 'SupplierInfo' then KEY_REF end) SupplierInfo,
  max(case when LU_NAME = 'PurchaseOrder' then KEY_REF end) PurchaseOrder,
  max(case when LU_NAME = 'PurchaseReceipt' then KEY_REF end) PurchaseReceipt,
  max(case when LU_NAME = 'InventoryPart' then KEY_REF end) InventoryPart
from
(
  select ncr_no, 
    LU_NAME, 
    substring(KEY_REF, charindex('=', key_ref)+1 , len(key_ref)) KEY_REF
  from yourtable
) src
group by ncr_no;

SQL Fiddle with Demoを参照してください。

注: これは使用できる基本的な構文ですが、使用しているデータベースによって異なる場合があります。

于 2013-03-15T15:09:57.893 に答える