Sql 以自定义标签作为行的轴
我正在尝试为每个聚合列添加标签。 我创建了这个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)
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