如何在SQL Developer的新列中按日期显示数据?

时间:2016-04-06 22:48:26

标签: oracle

我有以下数据:类型重复和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

2 个答案:

答案 0 :(得分:1)

您可以使用条件聚合:

SQL Fiddle

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