我有以下情况。我有一张包含所有文章信息的表格。我想用自己比较同一列。因为我有多种类型的文章。单品和母版产品。我不得不区别于它的唯一方法是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再次在列上而不是cout它。总的来说,我将是4个独特的sku,而不是" 6(总计)"。请告诉我。如果这是可能的。
答案 0 :(得分:1)
假设主SKU的长度为5个字符,请尝试:
select a.*
from mytable a
left join mytable b on b.sku like concat(a.sku, '%')
where length(a.sku) = 5
and b.sku is null
此查询将主SKU连接到子级SKU,但过滤掉成功的连接 - 只留下单独的主SKU。
答案 1 :(得分:0)
您可以通过对唯一行进行分组和计数来完成此操作。
首先,我们需要使用您的表并添加一个新列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,版本和颜色或每个连字符代表的任何内容。