我有一张包含20多列的大型订单表。其中有ACCOUNT_ID和PAYMENT_TYPE。
我希望根据首选(最常见)付款方式设置三个单独的表格。
我可以轻松地计算每个客户的付款类型,但不知道实现我需要的逻辑背后。
希望有人能指出我正确的方向吗?
如果不清楚,或者需要一个例子,请告诉我
答案 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
)