如何在Oracle

时间:2015-08-30 15:38:30

标签: sql oracle

我有一个表格,其字段和值看起来像这样。

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;

2 个答案:

答案 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;