查找特定值并进行转录

时间:2018-08-17 13:34:09

标签: sql sql-server

如何查找组值?

示例我有以下SKU:

SkuId                   Description

VN0A46ZERWV113000M      CLASSIC
VN0A46ZERWV112000M      CLASSIC
VN0A46ZERWV111500M      CLASSIC
VN0A3WCVAZ31XXL         Modern
VN0A3WCVAZ310XL         Modern
VN0A3WCVAZ3100S         Modern
VN0A3WCVAZ3100M         Modern
VN0A3TE3RCO113000M      Not Classic
VN0A3TE3RCO112000M      Not Classic
VN0A3TE3RCO111500M      Not Classic

如何描述... :)因此,我需要找到所有具有相同描述的Sku,在SKU中找到相同的部分,并在每组之后添加新行。通常,同一部分是前12个字符。

结果示例:

SkuId                   Description

VN0A46ZERWV113000M      CLASSIC
VN0A46ZERWV112000M      CLASSIC
VN0A46ZERWV111500M      CLASSIC
VN0A46ZERWV1            NEW
VN0A3WCVAZ31XXL         Modern
VN0A3WCVAZ310XL         Modern
VN0A3WCVAZ3100S         Modern
VN0A3WCVAZ3100M         Modern
VN0A3WCVAZ31            NEW
VN0A3TE3RCO113000M      Not Classic
VN0A3TE3RCO112000M      Not Classic
VN0A3TE3RCO111500M      Not Classic
VN0A3TE3RCO1            NEW

2 个答案:

答案 0 :(得分:2)

如果我理解正确,则可以尝试使用UNION ALLsubstring函数来制作它。

使用substring从子查询的SkuId列中获取前12个字符,然后distinct删除重复的前12个字符SkuId,然后再UNION ALL两个结果集。

CREATE TABLE T(
  SkuId VARCHAR(100),
  Description VARCHAR(100)
);

INSERT INTO T VALUES ('VN0A46ZERWV113000M' ,'CLASSIC');
INSERT INTO T VALUES ('VN0A46ZERWV112000M' ,'CLASSIC');
INSERT INTO T VALUES ('VN0A46ZERWV111500M' ,'CLASSIC');
INSERT INTO T VALUES ('VN0A3WCVAZ31XXL' ,'Modern');
INSERT INTO T VALUES ('VN0A3WCVAZ310XL' ,'Modern');
INSERT INTO T VALUES ('VN0A3WCVAZ3100S' ,'Modern');
INSERT INTO T VALUES ('VN0A3WCVAZ3100M' ,'Modern');
INSERT INTO T VALUES ('VN0A3TE3RCO113000M' ,'Not Classic');
INSERT INTO T VALUES ('VN0A3TE3RCO112000M' ,'Not Classic');
INSERT INTO T VALUES ('VN0A3TE3RCO111500M' ,'Not Classic');

查询1

SELECT * FROM (
  select SkuId,Description
  from T
  UNION ALL 
  SELECT distinct substring(SkuId,1,12) ,'New'  
  FROM T
) t1
order by SkuId desc

Results

|              SkuId | Description |
|--------------------|-------------|
| VN0A46ZERWV113000M |     CLASSIC |
| VN0A46ZERWV112000M |     CLASSIC |
| VN0A46ZERWV111500M |     CLASSIC |
|       VN0A46ZERWV1 |         New |
|    VN0A3WCVAZ31XXL |      Modern |
|    VN0A3WCVAZ310XL |      Modern |
|    VN0A3WCVAZ3100S |      Modern |
|    VN0A3WCVAZ3100M |      Modern |
|       VN0A3WCVAZ31 |         New |
| VN0A3TE3RCO113000M | Not Classic |
| VN0A3TE3RCO112000M | Not Classic |
| VN0A3TE3RCO111500M | Not Classic |
|       VN0A3TE3RCO1 |         New |

答案 1 :(得分:1)

我认为您想要的其他行是:

String

对于您的数据以及可能的问题,这可能会做到:

select skuid, 'NEW'
from (select distinct left(skuid, 12) as skuid, description
      from skus
     ) t;

如果您特别想排除具有不同描述的“名称”:

select distinct left(skuid, 12) as skuid, 'New'
from skus;

您可以使用select left(skuid, 12) as skuid, 'New' from skus group by left(skuid, 12) having min(description) = max(description); 将它们添加到表中:

insert

如果只需要一个结果集,则使用insert into skus (skuid, description) select distinct left(skuid, 12) as skuid, 'New' from skus; 和正确的union

order by