Sql 以自定义标签作为行的轴

Sql 以自定义标签作为行的轴,sql,oracle,Sql,Oracle,我正在尝试为每个聚合列添加标签。 我创建了这个SQL,但我认为它可以缩短 select * from ( select 'Orders' as Label, UNIT, NUMBER_OF_ORDERS from PS_TABLE1 where TRANSACTION_DATE = trunc(sysdate)-1 and UNIT in ('NYC','BOS') ) pivot ( SUM(NUMBER_OF_ORDERS) FOR ( UNIT)

我正在尝试为每个聚合列添加标签。 我创建了这个SQL,但我认为它可以缩短

select * from (
    select 'Orders' as Label, UNIT, NUMBER_OF_ORDERS 
    from PS_TABLE1
    where TRANSACTION_DATE = trunc(sysdate)-1 and UNIT in ('NYC','BOS')
)
pivot (
    SUM(NUMBER_OF_ORDERS) 
    FOR ( UNIT) IN ('BOS' as BOS,'NYC' as NYC)
)
union
select * from (
    select  'Items' as Label, UNIT,NUMBER_OF_ITEMS 
    from PS_TABLE1
    where TRANSACTION_DATE = trunc(sysdate)-1 and UNIT in ('NYC','BOS')
)
pivot (
    SUM(NUMBER_OF_ITEMS) 
    FOR ( UNIT) IN ('BOS' as BOS,'NYC' as NYC)
)
结果:

LABEL |BOS|NYC
Items |601|416
Orders|94 |79

我有其他列,但如果我使用union,这个查询将非常长。如果您有任何想法,我们将不胜感激。

我想使用案例透视法可以缩短此查询-

SELECT 'Items'
      ,SUM(CASE WHEN Unit = 'BOS' THEN NUMBER_OF_ITEMS END)
      ,SUM(CASE WHEN Unit = 'NYC' THEN NUMBER_OF_ITEMS END)
FROM PS_TABLE1
WHERE TRANSACTION_DATE = TRUNC(SYSDATE)-1
UNION ALL
SELECT 'Orders'
      ,SUM(CASE WHEN Unit = 'BOS' THEN NUMBER_OF_ORDERS END)
      ,SUM(CASE WHEN Unit = 'NYC' THEN NUMBER_OF_ORDERS END)
FROM PS_TABLE1
WHERE TRANSACTION_DATE = TRUNC(SYSDATE)-1
类似于(未经测试)


重塑此数据的一种方法实际上是将
UNPIVOT
作为预备(分配所需的
标签
s),然后在扩展的数据集上执行单个
PIVOT

这种方法将初始行扩展转换为更简洁的查询——请注意,这里有成本权衡和性能影响

下面是一个示例,其中包括您所包含的列:

--数据设置示例:

CREATE TABLE PS_TABLE1(UNIT VARCHAR2(32), NUMBER_OF_ORDERS NUMBER, NUMBER_OF_ITEMS NUMBER, TRANSACTION_DATE DATE);

-- Target Data (a couple records to sum for BOS)
INSERT INTO PS_TABLE1 VALUES ('BOS', 25, 55, TRUNC(SYSDATE -1));
INSERT INTO PS_TABLE1 VALUES ('BOS', 10, 15, TRUNC(SYSDATE -1));
INSERT INTO PS_TABLE1 VALUES ('NYC', 250, 550, TRUNC(SYSDATE -1));
-- Other filler data 
INSERT INTO PS_TABLE1 VALUES ('BOS', 253, 785, TRUNC(SYSDATE -2));
INSERT INTO PS_TABLE1 VALUES ('NYC', 175, 315, TRUNC(SYSDATE -2));
INSERT INTO PS_TABLE1 VALUES ('DEN', 1000, 2000, TRUNC(SYSDATE -1));
然后查询:

SELECT LABEL, BOS, NYC FROM (
    SELECT UNIT, LABEL, COUNT_IN_CATEGORY
    FROM (
        SELECT UNIT, NUMBER_OF_ITEMS AS ITEMS, NUMBER_OF_ORDERS AS ORDERS
        FROM PS_TABLE1
        WHERE TRANSACTION_DATE = TRUNC(SYSDATE) - 1)
        -- Other columns can be added here
        UNPIVOT (COUNT_IN_CATEGORY FOR LABEL IN (ITEMS, ORDERS))
) PIVOT (SUM (COUNT_IN_CATEGORY) FOR UNIT IN ('BOS' AS BOS, 'NYC' AS NYC))
ORDER BY LABEL ASC;
结果:

    LABEL    BOS    NYC
_________ ______ ______
ITEMS         70    550
ORDERS        35    250

先做你的工会再做支点
    LABEL    BOS    NYC
_________ ______ ______
ITEMS         70    550
ORDERS        35    250