【问题标题】:ORDER results based on a custom orderORDER 结果基于自定义订单
【发布时间】:2021-09-30 02:21:50
【问题描述】:

我有一个包含 5000 多种产品的表格。一列包含产品的尺寸(衣服、鞋子等),我需要添加两个级别的ORDERing。首先按产品名称,然后按大小(以便稍后按正确顺序将它们导入另一个应用程序).​​..

我已经为您设置了一个小小提琴here,我尝试在其中包含尽可能多的不同案例

问题是尺码值混杂,视产品而定...有:

  • 数值(43、40.5、42 1/3、38 1/2)
  • 字符尺寸(XXS、XS、S、M、L、XL、XXL、2XL、XXXL、3XL)
  • 范围(4-6、7-8、32-34、38-42),
  • 文字尺寸(三号、五号、无尺寸)

在所有这些中,最明显的是数值,但即使对于那些,我担心ORDER BY 在必须排序时会感到困惑,比如 40.5 和 41 1/2,或者换句话说,当它必须对小数和混合分数等进行排序时

编辑:确实,它会将数字排序为文本,将28 1/2 小数排序在28 1/3 之前,并在以28 开头的任何大小的末尾排序28.5...

当它必须对字符大小进行排序时,事情会变得更加复杂,它必须在 XXS 之前,在 XS 之前,然后是 S 等等......

我也不确定它是如何对范围进行排序的......

总而言之,对于 SQL 来说,这似乎是一项非常乏味甚至几乎不可能完成的工作......

我认为的一个解决方案是至少为字符大小和文本大小制作一个临时混合表,我将在其中定义正确的顺序,因此 SQL 将根据该参考表对我的产品进行排序(如果可能的话) .问题是我不能在该表中包含数字大小,因为它们太多了......我的意思是,为了将来万无一失,我必须包括所有小数,比如说 54,并且它们的通常混合分数(n 1/3,n 1/2,n 2/3)...

据我所知,产品目前使用的独特价值如下:

2
4
5
6
7
8
9
10
11
12
14
16
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
50
52
54
116
128
140
152
164
S
M
L
XL
XXL
47.5
48 1/2
42 1/2
44 1/2
29.5
31.5
33.5
19.5
23.5
42.5
XS
One Size
35.5
37.5
44.5
45.5
40 2/3
44 2/3
43 1/3
47 1/3
46 2/3
42 2/3
41 1/3
45 1/3
38.5
39 1/3
31-35
34-38
38-42
42-46
46-50
2XL
37 1/3
36 2/3
26.5
21.5
27.5
32.5
22.5
48.5
28.5
40.5
30.5
39.5
41.5
36.5
23 1/2
38 2/3
37-39
34-36
43-45
31-33
40-42
27-30
35 1/2
18.5
3XL
35-38
39-42
43-46
Size Seven
24.5
Size Five
47-49
3-6
6-9
2-6
8-9
6-7
10-11
14-15
12-13
46.5
4XL
XXS
156-166
33 1/2
30 1/2
31 1/2
28 1/2
XXXL
No Size
46-48
L-XL
S-M
49 1/3
40 1/2
34.5
4-5
2-3
13-14
9-10
11-12
7-8

你能指导我处理这个问题的正确方向吗?

编辑:

我对尺码进行了深入分析,一一检查了所有活动的尺码列表,删除重复项等后,我最终得到:

► 我手工整理的这 5 个组:

XXS, XS, S, M, L, XL, XXL, 2XL, XXXL, 3XL, XXXXL, 4XL, 
S-M, L-XL, 
No Size, One Size, Size Five, Size Seven, 
25'', 27'', 
0-1, 0-3, 1-2, 2-3, 2-6, 3-4, 3-6, 4-5, 5-6, 6-7, 6-9, 6-14, 7-8, 8-9, 9-10, 9-12, 10-11, 11-12, 12-13, 12-18, 13-14, 14-15, 15-16, 16-17, 17-18, 27-30, 31-33, 31-35, 34-36, 34-38, 35-38, 37-39, 38-42, 39-42, 40-42, 42-46, 43-45, 43-46, 46-48, 46-50, 47-49, 47-50, 146-156, 156-166, 

► 我认为我的 SQL 可以很好地处理一堆数字大小(PHP 对它们进行了很好的排序)

所以我正在考虑创建一个参考表,通过它我将对任何非数字大小进行排序,然后以某种方式将其余的数字大小转换为数字并相应地对它们进行排序。

但是我怎样才能实现所有这些理论场景呢?

EDIT2:

我试过了,ISNUMERIC(28 1/2) 甚至没有返回 1,所以这让它变得更加困难......

【问题讨论】:

  • 假设给定的产品只有 4 个尺寸选项中的 1 个,您需要指定如何将其转换为订购,然后编写 SQL 对其进行转换。如果数据库设计正确,那么大小选项将存储在另一个表中,您可以在大小表中添加OrderBy 列,该列是数字且易于排序。
  • 是的,没错,同一种商品只有同种尺寸的尺码。
  • 数据库的设计不是很好,而且我完全无法控制它。它来自一个较旧的商家桌面应用程序,我正在为电子商务网站搭建一座桥梁...我只能运行 SELECT 查询来获取我需要的产品...我的工作的最终查询可以在这里找到stackoverflow.com/a/69384737/15576971 剩下的就是进行我在这里描述的排序!

标签: sql sql-server tsql sql-order-by


【解决方案1】:

根据您指出的限制,即无法控制数据库结构,我建议硬编码类似于以下的映射表。您通常会将其存储在数据库中,作为存储大小信息的表的一部分。如果添加新尺寸,这将失败,但您对此无能为力。另一种选择是尝试使用基于规则的方法,在这种方法中,您可以根据了解尺寸的模式来尝试计算它,但我希望在这种情况下,这将是更多的工作而不是好处。

declare @MyTable table ([Name] varchar(32), Size varchar(32));

insert into @MyTable ([Name], Size)
values
('Shirt','XS'),
('Shirt','XL'),
('Dress','7-8'),
('Dress','38-42');

select *
from @MyTable T
left join (
  values
  ('XXS', 1), ('XS', 2), ('S', 3), ('M', 4), ('L', 5), ('XL', 6), ('XXL', 7), ('2XL', 8), ('XXXL', 9), ('3XL', 10)
  , ('4-6', 1), ('7-8', 2), ('32-34', 3), ('38-42', 4)
) S1 (Size, OrderBy) on S1.Size = T.Size
order by T.[Name], S1.OrderBy;

【讨论】:

  • DaleK 能否请您阅读我编辑的问题,重点关注已编辑的部分,并就这种情况给我一个提示?
  • @FayeD。一旦提供了答案,就不能从根本上改变问题。您需要提出一个新问题。
猜你喜欢
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多