我有一个包含 20 多列的大型订单表。其中有 ACCOUNT_ID 和 PAYMENT_TYPE。
我想根据首选(最常见的)付款类型创建三个单独的表格。
我可以很容易地计算每个客户的付款类型,但不知道实现我需要的背后的逻辑。
希望有人能指出我正确的方向吗?
如果不清楚,或者需要一个例子,请告诉我
我有一个包含 20 多列的大型订单表。其中有 ACCOUNT_ID 和 PAYMENT_TYPE。
我想根据首选(最常见的)付款类型创建三个单独的表格。
我可以很容易地计算每个客户的付款类型,但不知道实现我需要的背后的逻辑。
希望有人能指出我正确的方向吗?
如果不清楚,或者需要一个例子,请告诉我
假设您希望将表拆分为不同的付款类型,使用视图而不是单独的表,或者每次在 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
)