平台:SQL Server(SSMS)
我有表tblorder
和tblorderproduct
。这些是这些表中的相关列:
Tblorder
:CUID(客户ID),OrOrderID(订单ID),CuName(客户名称),已完成(订单日期),OrCancellation(1 =已取消,0 =正常)
该表按日期按升序自动排序
Tblorderproduct
:OpOrderID(订单ID),OpOrderValue(订单价值)
tblorder.ororderid = tblorderprodcut.oporderid
目标:
显示最近100万客户(CUID和姓名)及其所有可订购的订单ID(不包括已取消的订单)。
然后将它们插入临时表#Recent1MCus
实施例
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
总结查询应该:
CUID的不同前1000000(分组依据或不分区)
显示与该CUID相关联的所有订单ID(如果按CUID分组,OrOrderID,您不能将最高1000000限制设置为CUID?)
选择客户时,我想要最近的1000000个不同的CUID,因此按照desc顺序完成。
尝试不同的方法后,我完全迷失了。我感谢任何帮助!
谢谢!
答案 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
我希望这会有所帮助。