我有一个表格,其字段和值看起来像这样。
CustomerID OrderMedium NumberofOrder
101 Computer 5
101 Phone 2
102 Computer 9
103 Computer 1
103 Phone 6
104 Phone 2
105 Computer 3
105 Phone 3
从上表中,我正在尝试使用字段CustomerID,OrderMedium,OnetoFiveOrders,SixtoTenOrders,Count创建另一个表。
customerID字段应包含CustomerID,OrderMedium字段应包含OrderMedium,OnetoFiveOrders应包含' Y'如果客户有一到五个订单,SixtoTenOrders应该包含一个' Y'如果客户有六到十个订单,并且计数应包含订单数量。
因此,例如,带有OrderMedium of Computer的CustomerID 101将有一个标记为' Y'在OnetoFiveOrders下,由于他们有5个订单,因此数量为5。
我遇到的问题是,如果具有不同订单介质的同一客户的总订单数大于5,那么它应该有一个标记为' Y'在SixtoTenOrders下,但仍然给出该媒体的订单数量
因此对于客户101,该表应如下所示。
CustomerID OrderMedium OnetoFiveOrders SixtoTenOrders Count
101 Computer Y 5
101 Phone Y 2
由于客户的订单总数为7,因此应该给出“Y'在SixtoTenOrders下,因为他们在电话订购中有2个订单,因此他们有2个订单。
我在使用这种方式处理/输出代码时遇到问题,并希望得到任何帮助或建议。
到目前为止,这是我的代码:
Select CustomerID, OrderMedium, NumberofOrder as Count, case when NumberofOrder between 1 and 5 then 'Y' else
case when NumberofOrder between 6 and 10 then 'Y'
else null
end as OnetoFiveOrders
end as SixtoTenOrders
from CustOrder;
答案 0 :(得分:0)
我现在无法访问Oracle实例,但是这样的事情应该有效:
SELECT
CustomerID,
OrderMedium,
CASE WHEN NumberOfOrder BETWEEN 1 AND 5 THEN 'Y' ELSE NULL AS OneToFiveOrders,
CASE WHEN NumberOfOrder BETWEEN 6 AND 10 THEN 'Y' ELSE NULL AS SixToTenOrders,
CASE WHEN NumberOfOrder BETWEEN 6 AND 10 THEN NumberOfOrder - 5 ELSE NumberOfOrder AS OrderCount
FROM CustOrder
GROUP BY CustomerID, OrderMedium;
我会指出,如果您正在处理大型表格,那将非常缓慢,因为它必须扫描整个事物。在这种情况下,请考虑将其分解为几个语句。
答案 1 :(得分:0)
如果你想要" Y"在基于客户总订单数的列中,然后使用分析函数:
Select CustomerID, OrderMedium,
(case when sum(NumberofOrder) over (partition by CustomerId) between 1 and 5
then 'Y'
end) as OnetoFiveOrders,
(case when sum(NumberofOrder) over (partition by CustomerId) between 6 and 10
then 'Y'
end) as SixtoTenOrders
, NumberofOrder as Count
from CustOrder
order by CustomerID;