Sql 根据最常见的订单计算付款类型并为客户分配标签
我有一个20多列的大订单表。其中包括帐户ID和付款类型 根据首选(最常见)付款类型,我想有三个单独的表格 我可以很容易地计算每个客户的付款类型,但不知道实现我所需要的背后的逻辑 希望有人能给我指出正确的方向Sql 根据最常见的订单计算付款类型并为客户分配标签,sql,sql-server,database,sql-server-2012,Sql,Sql Server,Database,Sql Server 2012,我有一个20多列的大订单表。其中包括帐户ID和付款类型 根据首选(最常见)付款类型,我想有三个单独的表格 我可以很容易地计算每个客户的付款类型,但不知道实现我所需要的背后的逻辑 希望有人能给我指出正确的方向 如果这一点不清楚,或者需要一个示例,请告知我假设您希望将表拆分为不同的付款类型,使用视图而不是单独的表,或者每次在订单中插入行时,您还需要通过某种机制(手动、触发等)插入相关的订单[PaymentType]表 正如学校所说: 在SQL中,视图是基于SQL结果集的虚拟表 声明 定义一个返回结果
如果这一点不清楚,或者需要一个示例,请告知我假设您希望将表拆分为不同的付款类型,使用视图而不是单独的表,或者每次在订单中插入行时,您还需要通过某种机制(手动、触发等)插入相关的订单[PaymentType]表 正如学校所说: 在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个动态表,您可以扩展上述内容,而不是将视图过滤到特定的支付类型,它们将在执行时过滤到最常见的第1、第2和第3个
下面是如何做到这一点的想法。lookup视图vw_OrdersTopThreePaymentMethods查看orders表,并按订单数量降序返回前三种付款类型(即第一、第二、第三)。然后有一些视图将获取该特定类型上的所有订单,以及所有可供您查询的订单信息
-- 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
)
也许你可以创建3个不同的视图来代替修改表。看起来你混合了“数据库”和“表”(和/或“视图”)?对不起-是的,我指的是“表”RaphaelKira-问题是我可以计算每个视图的实例,但不能选择最频繁的实例,并将其与客户机id关联起来?示例将非常好。样本数据的几行及其预期结果。