Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据最常见的订单计算付款类型并为客户分配标签_Sql_Sql Server_Database_Sql Server 2012 - Fatal编程技术网

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

Sql 根据最常见的订单计算付款类型并为客户分配标签,sql,sql-server,database,sql-server-2012,Sql,Sql Server,Database,Sql Server 2012,我有一个20多列的大订单表。其中包括帐户ID和付款类型 根据首选(最常见)付款类型,我想有三个单独的表格 我可以很容易地计算每个客户的付款类型,但不知道实现我所需要的背后的逻辑 希望有人能给我指出正确的方向 如果这一点不清楚,或者需要一个示例,请告知我假设您希望将表拆分为不同的付款类型,使用视图而不是单独的表,或者每次在订单中插入行时,您还需要通过某种机制(手动、触发等)插入相关的订单[PaymentType]表 正如学校所说: 在SQL中,视图是基于SQL结果集的虚拟表 声明 定义一个返回结果

我有一个20多列的大订单表。其中包括帐户ID和付款类型

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

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

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


如果这一点不清楚,或者需要一个示例,请告知我

假设您希望将表拆分为不同的付款类型,使用视图而不是单独的表,或者每次在订单中插入行时,您还需要通过某种机制(手动、触发等)插入相关的订单[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关联起来?示例将非常好。样本数据的几行及其预期结果。