铂金版订单服务状态和订单取件状态示例.sql 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. use [lowdb2]
  2. --订单的取件状态;
  3. --创建非聚合索引,加快查询速度;
  4. DROP INDEX [IndexOrderPickup] ON [dbo].[tb_ErpOrderProductList]
  5. GO
  6. SET ANSI_PADDING ON
  7. GO
  8. CREATE NONCLUSTERED INDEX [IndexOrderPickup] ON [dbo].[tb_ErpOrderProductList]
  9. (
  10. [OPlist_Type] ASC
  11. )
  12. INCLUDE (
  13. [OPlist_OrderNumber],
  14. [OPlist_ViceNumber],
  15. [OPlist_PickupStatus]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  16. GO
  17. ;
  18. with
  19. ------------------------------------------------------------------------------------------------------
  20. --订单的服务状态;
  21. cte_OrderServices as (
  22. select [Ws_Number] as OrderNumber
  23. ,[Ws_ViceNumber] as ViceNumber
  24. ,(case
  25. when count(1) = count(case when [Ws_Status] = '0' then '未开始' end) then 0 -- 完全未开始;
  26. when count(1) != count(case when [Ws_Status] = '1' then '完成' end) then 1 -- 部分进行中;
  27. when count(1) = count(case when [Ws_Status] = '1' then '完成' end) then 2 -- 全部完成;
  28. end) as ServicesStatus
  29. from [tb_ErpWeddingService]
  30. group by [Ws_ViceNumber],[Ws_Number]
  31. ),
  32. /*
  33. --由于按ViceNumber分组, OrderNumber是相同的, 可以使用max或min来获取:
  34. cte_OrderServices as (
  35. select max([Ws_Number]) as OrderNumber
  36. ,[Ws_ViceNumber] as ViceNumber
  37. ,(case
  38. when count(1) = count(case when [Ws_Status] = '0' then '未开始' end) then 0 -- 完全未开始;
  39. when count(1) != count(case when [Ws_Status] = '1' then '完成' end) then 1 -- 部分进行中;
  40. when count(1) = count(case when [Ws_Status] = '1' then '完成' end) then 2 -- 全部完成;
  41. end) as ServicesStatus
  42. from [tb_ErpWeddingService]
  43. group by [Ws_ViceNumber]
  44. ),
  45. */
  46. ------------------------------------------------------------------------------------------------------
  47. --订单的取件状态;
  48. cte_OrderPickup as(
  49. select OPlist_OrderNumber as OrderNumber
  50. ,OPlist_ViceNumber as ViceNumber
  51. --订单最后一次的取件日期
  52. --,max(OPlist_PickupTime) as PickupTime
  53. ,(case
  54. when count(1) = count(case when OPlist_PickupStatus = 0 then '未取' end) then 0 -- 完全未取;
  55. when count(1) != count(case when OPlist_PickupStatus = 1 then '已取' end) then 1 -- 取件中;
  56. when count(1) = count(case when OPlist_PickupStatus = 1 then '已取' end) then 2 -- 全部取完;
  57. end) as PickupStatus
  58. from tb_ErpOrderProductList
  59. where OPlist_Type = '2'
  60. group by OPlist_ViceNumber,OPlist_OrderNumber
  61. )select Ordv_Number, Ordv_ViceNumber, isnull(PickupStatus,0)PickupStatus, isnull(ServicesStatus,0)ServicesStatus from tb_ErpOrderDigital
  62. Left Join cte_OrderServices ON cte_OrderServices.ViceNumber = Ordv_ViceNumber
  63. Left Join cte_OrderPickup ON cte_OrderPickup.ViceNumber = Ordv_ViceNumber
  64. /*
  65. --由于按ViceNumber分组, OrderNumber是相同的, 可以使用max或min来获取:
  66. cte_OrderPickup as(
  67. select max(OPlist_OrderNumber) as OrderNumber
  68. ,OPlist_ViceNumber as ViceNumber
  69. --订单最后一次的取件日期
  70. --,max(OPlist_PickupTime) as PickupTime
  71. ,(case
  72. when count(1) = count(case when OPlist_PickupStatus = 0 then '未取' end) then 0 -- 完全未取;
  73. when count(1) != count(case when OPlist_PickupStatus = 1 then '已取' end) then 1 -- 取件中;
  74. when count(1) = count(case when OPlist_PickupStatus = 1 then '已取' end) then 2 -- 全部取完;
  75. end) as PickupStatus
  76. from tb_ErpOrderProductList
  77. where OPlist_Type = '2'
  78. group by OPlist_ViceNumber
  79. )select Ordv_Number, Ordv_ViceNumber, isnull(PickupStatus,0)PickupStatus, isnull(ServicesStatus,0)ServicesStatus from tb_ErpOrderDigital
  80. Left Join cte_OrderServices ON cte_OrderServices.ViceNumber = Ordv_ViceNumber
  81. Left Join cte_OrderPickup ON cte_OrderPickup.ViceNumber = Ordv_ViceNumber
  82. GO
  83. 如果包含取件时间,新建以下索引会加快查询:
  84. CREATE NONCLUSTERED INDEX [IndexOrderPickup] ON [dbo].[tb_ErpOrderProductList]
  85. (
  86. [OPlist_Type] ASC
  87. )
  88. INCLUDE (
  89. [OPlist_OrderNumber],
  90. [OPlist_ViceNumber],
  91. [OPlist_PickupStatus],
  92. [OPlist_PickupTime],
  93. ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  94. GO
  95. --以下方法,在有些情况下更快
  96. select max(OPlist_OrderNumber) OrderNumber
  97. ,OPlist_ViceNumber
  98. ,case sum(convert(int,OPlist_PickupStatus)) -- 如果OPlist_PickupStatus本身为整型,就不用再转换;
  99. when 0 then 0 -- 未取;
  100. when count(1) then 2 -- 已取;
  101. else 1 --部分取件;
  102. end as PickupStatus
  103. from tb_ErpOrderProductList where OPlist_Type = '2' group by OPlist_ViceNumber
  104. */
  105. ------------------------------------------------------------------------------------------------------
  106. GO
  107. -- 订单接单人(同一订单多个接单人串起来);
  108. with cte_OrderMan as (
  109. select OrdPe_OrderNumber, User_Name from tb_ErpOrdersPerson Left Join tb_ErpUser ON tb_ErpOrdersPerson.OrdPe_OrdersPerson = tb_ErpUser.User_EmployeeID
  110. ),
  111. cte_OrderPerson as (
  112. select
  113. tb1.OrdPe_OrderNumber as OrderNumber
  114. ,stuff((
  115. select ','+ User_Name
  116. from cte_OrderMan as tb0 where tb0.OrdPe_OrderNumber = tb1.OrdPe_OrderNumber
  117. for xml path('')),1,1,'') as OrderPerson
  118. from cte_OrderMan as tb1
  119. group by tb1.OrdPe_OrderNumber
  120. )select * from cte_OrderPerson
  121. GO
  122. /*
  123. 另一种写法 outer apply:
  124. with cte_OrderMan as (
  125. select OrdPe_OrderNumber, User_Name from tb_ErpOrdersPerson Left Join tb_ErpUser ON tb_ErpOrdersPerson.OrdPe_OrdersPerson = tb_ErpUser.User_EmployeeID
  126. )
  127. select * from (select distinct OrdPe_OrderNumber from cte_OrderMan) TbA
  128. outer apply
  129. (select UserName = stuff(
  130. (select ',' + User_Name from cte_OrderMan TbB where TbB.OrdPe_OrderNumber = TbA.OrdPe_OrderNumber for xml path('')),1,1,'')
  131. )M
  132. where UserName like '%果果%'
  133. */
  134. ------------------------------------------------------------------------------------------------------
  135. GO
  136. --拍照状态;
  137. with cte_PhotographyStatus as(
  138. select max(Ordpg_Number) Ordpg_Number
  139. ,Ordpg_ViceNumber
  140. --获取最大的景点名称,但是当订单类型为婚纱订单时,由于婚纱订单的副订单号是一样的,会不准确;
  141. ,max(Ordpg_Sights) as Ordpg_Sights
  142. --获取最大的景点拍照时间,但是当订单类型为婚纱订单时,由于婚纱订单的副订单号是一样的,会不准确;
  143. ,max(Ordpg_PhotographyTime) as Ordpg_PhotographyTime
  144. --获取最小的预约时间,但是当订单类型为婚纱订单时,由于婚纱订单的副订单号是一样的,会不准确
  145. ,min(Ordpg_ReservationPhotographyTime) as ReservationPhotographyTime
  146. ,case when count(case when Ordpg_PhotographyStatus = 1 then '拍照' end) = Count(1) then 1 else 0 end as Ordpg_PhotographyStatus
  147. from tb_ErpOrdersPhotography
  148. group by Ordpg_ViceNumber
  149. )select * from cte_PhotographyStatus
  150. GO
  151. /* 如果是纯粹的获取整个订单的拍照状态
  152. GO
  153. with cte_PhotographyStatus as(
  154. select max(Ordpg_Number) Ordpg_Number
  155. ,Ordpg_ViceNumber
  156. ,case when count(case when Ordpg_PhotographyStatus = 1 then '拍照' end) = Count(1) then 1 else 0 end as Ordpg_PhotographyStatus
  157. from tb_ErpOrdersPhotography
  158. group by Ordpg_ViceNumber
  159. )select * from cte_PhotographyStatus
  160. GO
  161. */
  162. ------------------------------------------------------------------------------------------------------
  163. --订单客户表(同一订单的多客户串起来)
  164. GO
  165. with cte_OrderCustomer as (
  166. select
  167. -- 订单号;
  168. [tb_ErpCustomerGroup].[GP_OrderNumber]
  169. -- 客户组ID;
  170. ,[tb_ErpCustomerGroup].[GP_CustomerGroupID]
  171. -------------------------------------------------------------------------------------
  172. --客户人员表中的客户编号ID
  173. ,[tb_ErpCustomerGroupMembers].[GM_CustomerID]
  174. --是否为主联系人 1 为主联系人
  175. ,[tb_ErpCustomerGroupMembers].[GM_Master]
  176. -------------------------------------------------------------------------------------
  177. --客户姓名
  178. ,[tb_ErpCustomer].[Cus_Name]
  179. --客户姓名拼音
  180. ,[tb_ErpCustomer].[Cus_NamePinyin]
  181. --客户性别;0(false):男,1(true):女
  182. ,(case when [tb_ErpCustomer].[Cus_Sex] = 0 then '男' else '女' end) as [Cus_Sex]
  183. --客户QQ
  184. ,[tb_ErpCustomer].[Cus_QQ]
  185. --微信号;
  186. ,[tb_ErpCustomer].[Cus_MicroSignal]
  187. --电话;
  188. ,[tb_ErpCustomer].[Cus_Telephone]
  189. -------------------------------------------------------------------------------------
  190. from tb_ErpCustomerGroup Right Join tb_ErpCustomerGroupMembers ON tb_ErpCustomerGroup.GP_CustomerGroupID = tb_ErpCustomerGroupMembers.GM_CustomerGroupID
  191. Left JOIN tb_ErpCustomer ON tb_ErpCustomerGroupMembers.GM_CustomerID = tb_ErpCustomer.Cus_CustomerNumber
  192. ),
  193. cte_OrderCustomers as(
  194. select tb0.GP_OrderNumber as OrderNumber
  195. ,max(tb0.GP_CustomerGroupID)as GroupID
  196. ,stuff((select ',' + tb1.Cus_Name from cte_OrderCustomer tb1 where tb0.GP_OrderNumber = tb1.GP_OrderNumber for xml path('')),1,1,'') as CustomersName
  197. ,stuff((select ',' + tb1.Cus_Sex from cte_OrderCustomer tb1 where tb0.GP_OrderNumber = tb1.GP_OrderNumber for xml path('')),1,1,'') as CustomersGender
  198. ,stuff((select ',' + tb1.Cus_Telephone from cte_OrderCustomer tb1 where tb0.GP_OrderNumber = tb1.GP_OrderNumber for xml path('')),1,1,'') as CustomersPhone
  199. from cte_OrderCustomer tb0 group by tb0.GP_OrderNumber
  200. )select * from cte_OrderCustomers
  201. GO
  202. /*
  203. 另一种写法 outer apply:
  204. with cte_OrderCustomer as (
  205. select
  206. -- 订单号;
  207. [tb_ErpCustomerGroup].[GP_OrderNumber]
  208. -- 客户组ID;
  209. ,[tb_ErpCustomerGroup].[GP_CustomerGroupID]
  210. -------------------------------------------------------------------------------------
  211. --客户人员表中的客户编号ID
  212. ,[tb_ErpCustomerGroupMembers].[GM_CustomerID]
  213. --是否为主联系人 1 为主联系人
  214. ,[tb_ErpCustomerGroupMembers].[GM_Master]
  215. -------------------------------------------------------------------------------------
  216. --客户姓名
  217. ,[tb_ErpCustomer].[Cus_Name]
  218. --客户姓名拼音
  219. ,[tb_ErpCustomer].[Cus_NamePinyin]
  220. --客户性别;0(false):男,1(true):女
  221. ,(case when [tb_ErpCustomer].[Cus_Sex] = 0 then '男' else '女' end) as [Cus_Sex]
  222. --客户QQ
  223. ,[tb_ErpCustomer].[Cus_QQ]
  224. --微信号;
  225. ,[tb_ErpCustomer].[Cus_MicroSignal]
  226. --电话;
  227. ,[tb_ErpCustomer].[Cus_Telephone]
  228. -------------------------------------------------------------------------------------
  229. from tb_ErpCustomerGroup Right Join tb_ErpCustomerGroupMembers ON tb_ErpCustomerGroup.GP_CustomerGroupID = tb_ErpCustomerGroupMembers.GM_CustomerGroupID
  230. Left JOIN tb_ErpCustomer ON tb_ErpCustomerGroupMembers.GM_CustomerID = tb_ErpCustomer.Cus_CustomerNumber
  231. )
  232. select * from
  233. (select GP_OrderNumber as OrderNumber, max(GP_CustomerGroupID) GroupID from cte_OrderCustomer group by GP_OrderNumber) TA
  234. outer apply
  235. (
  236. select
  237. UserName = stuff((select ',' + Cus_Name from cte_OrderCustomer where TA.OrderNumber = GP_OrderNumber for xml path('')),1,1,'')
  238. ,UserGender = stuff((select ',' + Cus_Sex from cte_OrderCustomer where TA.OrderNumber = GP_OrderNumber for xml path('')),1,1,'')
  239. ,UserTelephone = stuff((select ',' + Cus_Telephone from cte_OrderCustomer where TA.OrderNumber = GP_OrderNumber for xml path('')),1,1,'')
  240. )TB
  241. */
  242. ------------------------------------------------------------------------------------------------------
  243. --拍照景点(主要是将婚纱的景点名串起来)
  244. GO
  245. with cte_OrderScenery as (
  246. select max(tb0.Ordpg_Number) as OrderNumber
  247. ,tb0.Ordpg_ViceNumber as OrderViceNumber
  248. -- 景点名串;
  249. ,stuff((select ',' + tb1.Ordpg_Sights from tb_ErpOrdersPhotography tb1 where tb0.Ordpg_ViceNumber = tb1.Ordpg_ViceNumber for xml path('')),1,1,'') as OrderScenerys
  250. -- 各景点摄影师串;
  251. ,stuff((select ',' + tb1.Ordpg_Photographer from tb_ErpOrdersPhotography tb1 where tb0.Ordpg_ViceNumber = tb1.Ordpg_ViceNumber for xml path('')),1,1,'') as OrderPhotographers
  252. -- 各景点拍照状态串;
  253. ,stuff((select ',' + tb1.Ordpg_PhotographyStatus from tb_ErpOrdersPhotography tb1 where tb0.Ordpg_ViceNumber = tb1.Ordpg_ViceNumber for xml path('')),1,1,'') as OrderPhotographyStatus
  254. from tb_ErpOrdersPhotography tb0 group by tb0.Ordpg_ViceNumber
  255. )select * from cte_OrderScenery
  256. GO
  257. ------------------------------------------------------------------------------------------------------