Sql 查找特定值并进行批处理
如何找到组值 示例我有以下SKU:Sql 查找特定值并进行批处理,sql,sql-server,Sql,Sql Server,如何找到组值 示例我有以下SKU: SkuId Description VN0A46ZERWV113000M CLASSIC VN0A46ZERWV112000M CLASSIC VN0A46ZERWV111500M CLASSIC VN0A3WCVAZ31XXL Modern VN0A3WCVAZ310XL Modern VN0A3WCVAZ3100S Modern VN0A3W
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
如果我理解正确,您可以尝试使用
UNION ALL
和函数来实现它
使用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
| 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 |
:
SELECT * FROM (
select SkuId,Description
from T
UNION ALL
SELECT distinct substring(SkuId,1,12) ,'New'
FROM T
) t1
order by SkuId desc
| 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 |
如果我理解正确,您可以尝试使用
UNION ALL
和函数来实现它
使用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
| 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 |
:
SELECT * FROM (
select SkuId,Description
from T
UNION ALL
SELECT distinct substring(SkuId,1,12) ,'New'
FROM T
) t1
order by SkuId desc
| 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 |
我认为您需要的其他行是:
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
:
select skuid, description
from ((select skuid, description, 1 as priority
from skus
) union all
(select distinct left(skuid, 12) as skuid, 'New', 2
from skus
)
) sd
order by skuid, priority;
我认为您需要的其他行是:
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
:
select skuid, description
from ((select skuid, description, 1 as priority
from skus
) union all
(select distinct left(skuid, 12) as skuid, 'New', 2
from skus
)
) sd
order by skuid, priority;
VN0A46ZERWV1
作为SKU出现的逻辑是什么,例如VN0A46ZerWv11500M
?@TimBiegeleisen我们应该截断SkuId中的前12个字符,并像单独的SKU一样添加这些字符。您提到这一行时,请在“之后”加上,但这些数据中没有表示顺序的任何内容。您是要在select语句中执行此操作,还是要向表中添加数据。这个问题需要很多帮助才能弄清楚。您正在寻找函数编辑:Linked vba left而不是sqlINSERT YourTable(SkuId,Description)选择DISTINCT left(SkuId,12),表格中的“新建”VN0A46ZERWV1
作为SKU出现的逻辑是什么,例如,VN0A46ZerWv11500M
?@TimBiegeleisen我们应该截断SkuId中的前12个字符,并添加这些字符,就像单独的SKU一样。您在“之后”提到了关于这一行的内容,但这些数据中没有任何表示顺序的内容。您是要在select语句中执行此操作,还是要向表中添加数据。这个问题需要很多帮助才能弄清楚。您正在寻找函数编辑:Linked vba left而不是sqlINSERT YourTable(SkuId,Description)从YourTable中选择DISTINCT left(SkuId,12),“NEW”(新建)!非常感谢你@你真的应该接受答案,特别是当他们提供了一个优雅的解决方案。太好了!非常感谢你@KirillRodeonov你真的应该接受答案,特别是当他们提供了一个优雅的解决方案。