我有以下情况。我有一张桌子,上面有文章的所有信息。我想将同一列与其自身进行比较。因为我有多种类型的文章。单一产品和主产品。我唯一需要区别的方法是SKU。例如。
ID | SKU
1 | 11111
2 | 11112
3 | 11113
4 | 11113-5
5 | 11113-8
6 | 11114
7 | 11115
8 | 11115-1-W
9 | 11115-2
10 | 11116
我只想列出或/并仅计算完全唯一的sku。跟随这个例子,唯一且没有变量的sku是(ID = 1、2、6和10),我将要创建一个查询,如果11113再次出现在该列上,则不进行查询。因此,总共我将是4个唯一的sku,而不是“ 6(总共)”。请告诉我。如果可能的话。
最佳答案
您可以通过对唯一行进行分组和计数来做到这一点。
首先,我们需要处理您的表并添加一个新列MasterSKU
。这将是SKU
列的前五个字符。一旦有了MasterSKU
,就可以GROUP BY
了。这会将具有相同MasterSKU
的所有行捆绑在一起。分组后,便可以访问COUNT()
之类的聚合函数。我们将使用该函数计算每个MasterSKU
的行数。然后,我们将过滤出COUNT()
大于1的所有行。这将使您仅剩下唯一的行。
取得该唯一列表,然后将其LEFT JOIN
返回到原始表中以获取ID。
SELECT ID, A.MasterSKU
FROM (
SELECT
MasterSKU = SUBSTRING(SKU,1,5),
MasterSKUCount = COUNT(*)
FROM MyTable
GROUP BY SUBSTRING(SKU,1,5)
HAVING COUNT(*) = 1
) AS A
LEFT JOIN (
SELECT
ID,
MasterSKU = SUBSTRING(SKU,1,5)
FROM MyTable
) AS B
ON A.MasterSKU = B.MasterSKU
现在,我从您的示例中注意到了一件事。原始的SKU列实际上看起来像是三列合为一列。我们将多个值与连字符连接在一起。
11115-1-W
可能是有原因的,但是最有可能违反first normal form,这将使数据库难以查询。这就是为什么需要如此复杂的查询的部分原因。如果SKU列确实代表多个内容,那么我们可能要考虑将其分为MasterSKU,Version和Color或每个连字符代表的内容。
关于mysql - SQL验证具有相同列的列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44055009/