SQL验证具有相同列的列

时间:2017-05-18 18:07:19

标签: mysql sql

我有以下情况。我有一张包含所有文章信息的表格。我想用自己比较同一列。因为我有多种类型的文章。单品和母版产品。我不得不区别于它的唯一方法是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(总计)"。请告诉我。如果这是可能的。

2 个答案:

答案 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

enter image description here

现在我注意到你的一个例子。最初的SKU列看起来真的像三列一样。我们有多个价值观与大量加入。

11115-1-W

可能有一个原因,但很可能会违反first normal form并且会使数据库难以查询。这是为什么需要这样复杂的查询的部分原因。如果SKU列真的代表了多个东西,那么我们可能会考虑将其分解为MasterSKU,版本和颜色或每个连字符代表的任何内容。