检索最新客户并插入Tempdb

时间:2018-01-22 18:35:43

标签: sql sql-server

平台:SQL Server(SSMS)

我有表tblordertblorderproduct。这些是这些表中的相关列:

  • Tblorder:CUID(客户ID),OrOrderID(订单ID),CuName(客户名称),已完成(订单日期),OrCancellation(1 =已取消,0 =正常)

    该表按日期按升序自动排序

  • Tblorderproduct:OpOrderID(订单ID),OpOrderValue(订单价值)

tblorder.ororderid = tblorderprodcut.oporderid

目标:

  1. 显示最近100万客户(CUID和姓名)及其所有可订购的订单ID(不包括已取消的订单)。

  2. 然后将它们插入临时表#Recent1MCus

  3. 实施例

    CUID  OrderID   CUName      completedate
    ----------------------------------------
    3     201       Joe P       2017 06 02
    3     202       Joe P       2017 06 25
    1     203       Jason A     2017 07 21
    4     204       Jason C     2017 08 31
    7     205       Nick C      2017 09 03
    2     206       Ari C       2017 10 01
    3     207       Joe P       2017 10 21
    1     208       Jason A     2017 11 05
    

    让我们说我只想要最近的两个客户(为了示例)和他们的所有订单

    所以查询应该返回:

    CUID  OrderID   CUName      completedate
    ----------------------------------------
    1     208       Jason A     2017 11 05
    1     203       Jason A     2017 07 21
    3     207       Joe P       2017 10 21
    3     202       Joe P       2017 06 25
    3     201       Joe P       2017 06 02
    

    总结查询应该:

    1. CUID的不同前1000000(分组依据或不分区)

    2. 显示与该CUID相关联的所有订单ID(如果按CUID分组,OrOrderID,您不能将最高1000000限制设置为CUID?)

    3. 选择客户时,我想要最近的1000000个不同的CUID,因此按照desc顺序完成。

    4. 尝试不同的方法后,我完全迷失了。我感谢任何帮助!

      谢谢!

2 个答案:

答案 0 :(得分:1)

更新的解决方案

看起来这里有一些新东西 - 拥有最近客户的所有订单,而不仅仅是最近的订单。为此,我们将不得不第二次加入订单表。首先,我们将按照我们已经完成的订单找到最新客户(现在是内部查询),其次我们将找到与这些客户相关的所有订单(在外部查询中):

select t1.cuid, t1.cuname, t2.order_id, t2.ordervalue -- Etc.
from
    (select top 1000000 cuid, cuname
        into #Recent1MCus
        from tblorder t1
        group by cuid, cuname
        order by max(ordate) desc
    ) t1
inner join tblorder t2 on t2.cuid = y1.cuid

如果您需要外部选择列表中的相关产品数据等,您也可以加入外部查询中的产品表 - 或者在外部查询中查找组以查找每个cuid的总订单值等 - 但这是基本结构我想你想要的。

我希望这会有所帮助。

答案 1 :(得分:0)

试试这个(或参见更新的解决方案)

我觉得这听起来很熟悉;这是我2天前的答案:

TOP 1000000是可行的方法,但您需要ORDER BY子句,否则您将获得任意结果。在你的情况下,你提到你想要最新的那些,所以:

ORDER BY OrderDate DESC

此外,您可以考虑使用GROUP BY而不是DISTINCT。我认为它看起来更干净,并使选择列表保持一个选择列表,因此您可以选择包含您可能想要的任何其他内容(因为我冒昧地做了)。请注意,由于分组,ORDER BY现在使用MAX(ordate),因为客户可能有多个ordate,我们对最近的感兴趣。所以:

select top 1000000 cuid, cuname, sum(order_value) as ca_ching, count(distinct(order_id)) as order_count
into #Recent1MCus
from tblorder
group by cuid, cuname
order by max(ordate) desc

我希望这会有所帮助。