2

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

我想根据首选(最常见的)付款类型创建三个单独的表格。

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

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

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

4

1 回答 1

0

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

正如 W3schools 所说:

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

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

假设您希望按付款类型拆分它们,并且您有一个类似的付款类型表,如下所示:

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 个动态表,您可以扩展上述内容,而不是将视图过滤到特定的支付类型,它们会过滤到第一个、第二个在执行时排名第三。

如何做到这一点的想法如下。查找视图 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
)
于 2013-08-20T12:26:52.917 回答