我有以下数据:类型重复和pdt重复,但我想对其进行转换,以便唯一日期成为列,并且库存位于相应日期列的下方。
Pdt Type Inv Date
Toy BA10010 125 5-Apr-16
Toy BA10020 0 5-Apr-16
Toy BA10030 850 5-Apr-16
Toy BA10040 25 5-Apr-16
Toy BA10050 175 5-Apr-16
Toy BA10060 0 5-Apr-16
Toy BA10070 725 5-Apr-16
Toy BA10080 250 5-Apr-16
Toy BA10090 200 5-Apr-16
Toy BA10100 100 5-Apr-16
Toy BA10110 20 5-Apr-16
Toy BA10120 0 5-Apr-16
Toy BA10130 110 5-Apr-16
Toy BA10140 200 5-Apr-16
Toy BA10010 125 6-Apr-16
Toy BA10020 0 6-Apr-16
Toy BA10030 850 6-Apr-16
Toy BA10040 25 6-Apr-16
Toy BA10050 175 6-Apr-16
Toy BA10060 0 6-Apr-16
Toy BA10070 725 6-Apr-16
Toy BA10080 250 6-Apr-16
Toy BA10090 200 6-Apr-16
Toy BA10100 100 6-Apr-16
Toy BA10110 20 6-Apr-16
Toy BA10120 0 6-Apr-16
Toy BA10130 110 6-Apr-16
Toy BA10140 200 6-Apr-16
我使用了以下代码,但它返回了一堆空值。我不得不使用sum因为它要求一个函数。
select * from
(select pdt, type, Inv, date
from tablename)
Pivot (sum(Inv) for date in ( '05-APR-16','06-APR-16' ));
然后返回
Product Type Invenory 5-Apr-16 6-Apr-16
Toy BA10010 125 null null
Toy BA10020 0 null null
Toy BA10030 850 null null
Toy BA10040 25 null null
Toy BA10050 175 null null
Toy BA10060 0 null null
Toy BA10070 725 null null
Toy BA10080 250 null null
Toy BA10090 200 null null
Toy BA10100 100 null null
Toy BA10110 20 null null
Toy BA10120 0 null null
Toy BA10130 110 null null
Toy BA10140 200 null null
Toy BA10010 125 null null
Toy BA10020 0 null null
Toy BA10030 850 null null
Toy BA10040 25 null null
Toy BA10050 175 null null
Toy BA10060 0 null null
Toy BA10070 725 null null
Toy BA10080 250 null null
Toy BA10090 200 null null
Toy BA10100 100 null null
Toy BA10110 20 null null
Toy BA10120 0 null null
Toy BA10130 110 null null
Toy BA10140 200 null null
答案 0 :(得分:1)
您可以使用条件聚合:
SELECT
Pdt,
Type,
[5-Apr-16] = SUM(CASE WHEN Date = '20160405' THEN Inv ELSE 0 END),
[6-Apr-16] = SUM(CASE WHEN Date = '20160406' THEN Inv ELSE 0 END)
FROM tablename
GROUP BY
Pdt, Type
结果:
| Pdt | Type | 5-Apr-16 | 6-Apr-16 |
|-----|---------|----------|----------|
| Toy | BA10010 | 125 | 125 |
| Toy | BA10020 | 0 | 0 |
| Toy | BA10030 | 850 | 850 |
| Toy | BA10040 | 25 | 25 |
| Toy | BA10050 | 175 | 175 |
| Toy | BA10060 | 0 | 0 |
| Toy | BA10070 | 725 | 725 |
| Toy | BA10080 | 250 | 250 |
| Toy | BA10090 | 200 | 200 |
| Toy | BA10100 | 100 | 100 |
| Toy | BA10110 | 20 | 20 |
| Toy | BA10120 | 0 | 0 |
| Toy | BA10130 | 110 | 110 |
| Toy | BA10140 | 200 | 200 |
答案 1 :(得分:0)
不要将字符串文字用于日期值。
您的查询中有这个:
Pivot (
sum(Inv) for date in (
'05-APR-16',
'06-APR-16'
)
);
如果您将字符串转换为日期文字,那么它将起作用:
PIVOT (
SUM(INV) FOR "Date" IN (
DATE '2016-04-05' AS "05-Apr-2016",
DATE '2016-04-06' AS "06-Apr-2016"
)
)
Oracle安装程序:
CREATE TABLE tablename ( Pdt, Type, Inv, "Date" ) AS
SELECT 'Toy', 'BA10010', 125, DATE '2016-04-05' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10020', 0 , DATE '2016-04-05' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10030', 850, DATE '2016-04-05' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10040', 25 , DATE '2016-04-05' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10050', 175, DATE '2016-04-05' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10060', 0 , DATE '2016-04-05' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10070', 725, DATE '2016-04-05' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10080', 250, DATE '2016-04-05' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10090', 200, DATE '2016-04-05' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10100', 100, DATE '2016-04-05' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10110', 20 , DATE '2016-04-05' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10120', 0 , DATE '2016-04-05' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10130', 110, DATE '2016-04-05' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10140', 200, DATE '2016-04-05' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10010', 125, DATE '2016-04-06' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10020', 10 , DATE '2016-04-06' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10030', 800, DATE '2016-04-06' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10040', 20 , DATE '2016-04-06' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10050', 70, DATE '2016-04-06' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10060', 30 , DATE '2016-04-06' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10070', 425, DATE '2016-04-06' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10080', 150, DATE '2016-04-06' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10090', 300, DATE '2016-04-06' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10100', 200, DATE '2016-04-06' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10110', 30 , DATE '2016-04-06' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10120', 10 , DATE '2016-04-06' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10130', 210, DATE '2016-04-06' FROM DUAL UNION ALL
SELECT 'Toy', 'BA10140', 300, DATE '2016-04-06' FROM DUAL;
<强>查询强>:
SELECT *
FROM (
SELECT *
FROM tablename
)
PIVOT
(
SUM(INV)
FOR "Date" IN (
DATE '2016-04-05' AS "05-Apr-2016",
DATE '2016-04-06' AS "06-Apr-2016"
)
)
ORDER BY pdt, type
<强>输出强>:
PDT TYPE 05-Apr-2016 06-Apr-2016
--- ------- ----------- -----------
Toy BA10010 125 125
Toy BA10020 0 10
Toy BA10030 850 800
Toy BA10040 25 20
Toy BA10050 175 70
Toy BA10060 0 30
Toy BA10070 725 425
Toy BA10080 250 150
Toy BA10090 200 300
Toy BA10100 100 200
Toy BA10110 20 30
Toy BA10120 0 10
Toy BA10130 110 210
Toy BA10140 200 300