在查询

时间:2017-11-07 06:05:25

标签: sql oracle

我有一张这样的表

Saleperson  Product1     Product2    saleDate
---------------------------------------------
A             500           300     120217
B             600           200     110217

我想做的是

saleperson    newcolumn   saledate     Sale
--------------------------------------------
A             product1    120217       500
A             product2    120217       300
B             product1    110217       600
B             product2    110217       200

我试图使用数据透视表但似乎结果不正确。我坚持使用列名" product1,product2"

CREATE TABLE Sale(
saleperson VARCHAR(02) NOT NULL,
product1 int NOT NULL,
product2 int NOT NULL,
saleDate VARCHAR(10) NOT NULL);

INSERT INTO sale(saleperson,product1,product1,saledate) 
VALUES 
 ("A",500,300,"120217"),
 ("B",600,200,"110217")

3 个答案:

答案 0 :(得分:1)

您可以使用unpivot()

SELECT *
FROM sale 
unpivot (Sale FOR product_code IN (product1, product2));

<强>结果:

SALEPERSON  SALEDATE    PRODUCT_CODE    SALE
--------------------------------------------
A           120217      PRODUCT1        500
A           120217      PRODUCT2        300
B           110217      PRODUCT1        600
B           110217      PRODUCT2        200

<强> DEMO

答案 1 :(得分:0)

让我们分别选择product1product2的详细信息。

然后使用UNION ALL来合并结果。 SQL Fiddle

select Saleperson, 'product1' as newColumn, saledate,  Product1 as sale
from saleperson 

union all

select Saleperson, 'product2' as newColumn, saledate,  Product2 as sale
from saleperson 

答案 2 :(得分:0)

试试此链接,这可能会对您有所帮助。这个MS SQL Server建议:

SQL Server : Columns to Rows

 select SALEPERSON,
  indicatorname PRODUCT_CODE,
  SALEDATE,
  indicatorvalue SALE
from Sale
unpivot
(
  indicatorvalue
  for indicatorname in (product1, product2)
) unpiv;

我刚从上面的链接中得到结果。

SALEPERSON  PRODUCT_CODE    SALEDATE    SALE
A           product1        120217      500
A           product2        120217      300
B           product1        110217      600
B           product2        110217      200