根据最常见的订单计算付款类型并为客户分配标签

时间:2013-08-19 09:48:27

标签: sql sql-server database sql-server-2012

我有一张包含20多列的大型订单表。其中有ACCOUNT_ID和PAYMENT_TYPE。

我希望根据首选(最常见)付款方式设置三个单独的表格。

我可以轻松地计算每个客户的付款类型,但不知道实现我需要的逻辑背后。

希望有人能指出我正确的方向吗?

如果不清楚,或者需要一个例子,请告诉我

1 个答案:

答案 0 :(得分:0)

假设您希望将表拆分为不同的付款类型,使用视图而不是单独的表,或者每次在Orders中插入行时,还需要通过某种机制插入相关的Order [PaymentType]表(手动,触发)等)。

正如W3schools所说:

  

在SQL中,视图是基于SQL结果集的虚拟表   言。

您定义一个返回结果集的查询,然后您可以像对待表一样对待它。这意味着当您在Orders中插入行时,如果它们符合条件,您可以在视图中查看它们,您无需担心更新另一个表。

假设您希望将它们拆分为付款类型,并且您有类似的付款方式表格如下:

PaymentTypeId      PaymentTypeDesc
----------------------------------
1                  Cash
2                  Cheque
3                  Credit Card

然后以下可能就是你要找的东西。

CREATE VIEW vw_OrdersCash AS
SELECT *
FROM Orders
WHERE PAYMENT_TYPE = 1

CREATE VIEW vw_OrdersCheque AS
SELECT *
FROM Orders
WHERE PAYMENT_TYPE = 2

CREATE VIEW vw_OrdersCreditCard AS
SELECT *
FROM Orders
WHERE PAYMENT_TYPE = 3

只需将它们视为表格就可以随心所欲。

SELECT * FROM vw_OrdersCash

编辑:

在您的问题中阅读您的一条评论,听起来您希望它比上面的建议更具动态性。没有样本输出很难说你想要实现的是什么,但是如果你想要3个动态表,你可以扩展上面的内容,而不是过滤到特定支付类型的视图,它们会过滤到第1个,第2个在执行时最常见的第3个。

下面是如何做到这一点的想法。查看视图vw_OrdersTopThreePaymentMethods查看订单表,并按订单数量(即第1,第2,第3)的降序返回前三种付款类型。然后会有一些视图会抓取该特定类型的所有订单,所有订单信息都可供您根据需要进行查询。

-- A lookup view that returns the top 3 payment methods of orders

CREATE VIEW vw_OrdersTopThreePaymentMethods AS
    SELECT TOP 3 
        ROW_NUMBER() OVER(ORDER BY a.OrderCount DESC) AS Row,
        PAYMENT_TYPE, 
        OrderCount 
    FROM (
    SELECT PAYMENT_TYPE , COUNT(*) as 'OrderCount'
    FROM Orders
    GROUP BY PAYMENT_TYPE 
    ) a
    ORDER BY a.OrderCount desc

-- 3 views that then get the orders for the top three methods based on output of vw_OrdersTopThreePaymentMethods

CREATE VIEW vw_OrdersPrimaryPayment AS
SELECT *
FROM Orders
WHERE PAYMENT_TYPE IN (
    SELECT PAYMENT_TYPE
    FROM vw_OrdersTopThreePaymentMethods
    WHERE Row = 1
)

CREATE VIEW vw_OrdersSecondaryPayment AS
SELECT *
FROM Orders
WHERE PAYMENT_TYPE IN (
    SELECT PAYMENT_TYPE
    FROM vw_OrdersTopThreePaymentMethods
    WHERE Row = 2
)

CREATE VIEW vw_OrdersTertiaryPayment AS
SELECT *
FROM Orders
WHERE PAYMENT_TYPE IN (
    SELECT PAYMENT_TYPE
    FROM vw_OrdersTopThreePaymentMethods
    WHERE Row = 3
)