复制sql时,选择2个值中的1个
我不想字段文章没有重复和描述选择最短值。 我尝试了一些东西,但失败了。请帮我一个忙:( 这是我的结果复制sql时,选择2个值中的1个,sql,sql-server,Sql,Sql Server,我不想字段文章没有重复和描述选择最短值。 我尝试了一些东西,但失败了。请帮我一个忙:( 这是我的结果 RTICLE|说明 012.14.920 | M5欧制螺钉13.5 mm 017.31.639| Hospa 3.5x15毫米 017.31.639| Hospa 3.5x15mm 017.31.693| Hospa 3.5x35毫米 017.31.693 | Hospa 3.5x35 mm(无钻孔)不幸的是,没有用于最短路径的聚合函数,因此无法在分组中通过轻松表达这一点。因此,我们将在子查询中
RTICLE|说明
012.14.920 | M5欧制螺钉13.5 mm
017.31.639| Hospa 3.5x15毫米
017.31.639| Hospa 3.5x15mm
017.31.693| Hospa 3.5x35毫米
017.31.693 | Hospa 3.5x35 mm(无钻孔)
不幸的是,没有用于最短路径的聚合函数,因此无法在
分组中通过轻松表达这一点。因此,我们将在子查询中使用带窗口的函数:
SELECT *
FROM (
SELECT
I.ARTICLE,
i.DESCRIPTION,
I.TYPE,
SUM(CASE
When I.TYPE IN ('CONNECTOR','PROFILE') then (I.LENGTH * I.WIDTH)/1000000
END) AS QTY1,
COUNT(CASE
when I.TYPE IN('CONNECTOR','SPP') THEN I.ARTICLE
END) AS QTY2,
ROW_NUMBER() OVER (PARITION BY I.ARTICLE ORDER BY LEN(I.Description) RN
FROM IDBMASTER AS I
WHERE I.ORDER_NAME IN ('2018003071') AND I.TYPE='CONNECTOR'
) T
WHERE RN = 1
ORDER BY I.ARTICLE ASC;
在这里,我们可以在ROW_NUMBER()
表达式中使用LEN
,如果两个不同的描述同样短,我们将任意选择一个(如果您不想任意选择,请在ROW_NUMBER()
的顺序中为ROW_NUMBER()
添加更多表达式)解决此问题的一种方法使用第一个值()
。遗憾的是,它不能作为聚合函数使用,只能作为窗口函数使用
诀窍是使用选择DISTINCT
,并将其余的聚合函数转换为窗口函数:
SELECT DISTINCT I.ARTICLE,
FIRST_VALUE(i.DESCRIPTION) OVER (PARTITION BY i.ARTICLE ORDER BY LEN(i.DESCRIPTION) as DESCRIPTION,
I.TYPE,
SUM(CASE WHEN I.TYPE IN ('CONNECTOR','PROFILE') THEN (I.LENGTH * I.WIDTH)/1000000
END) OVER (PARTITION BY i.ARTICLE) AS QTY1,
SUM(CASE WHEN I.TYPE IN( 'CONNECTOR', 'SPP')
THEN 1 ELSE 0
END) OVER (PARTITION BY i.ARTICLE) AS QTY2k
FROM IDBMASTER AS I
WHERE I.ORDER_NAME IN ('2018003071') AND
I.TYPE = 'CONNECTOR'
ORDER BY I.ARTICLE ASC;
编辑问题添加示例数据和期望的结果将很有帮助。如果您对同一篇文章有不同的描述,则不能在Group By子句中有描述…也许您可以使用子查询…Yogesh对您的问题进行了编辑,以使您的数据可读并包含在您的问题中。您随后的编辑使情况变得更糟更糟的是,不是更好。我强烈希望回滚到第2版-我希望你这样做。我已编辑。你可以看到并帮助我,我已经给出了我认为应该有效的答案。如果没有,请进一步编辑并添加更多解释。Yogesh要求的示例数据也会有所帮助(我们需要样本数据,我们真的希望它是文本而不是图像,这样我们就可以将它复制粘贴到查询窗口中,并为您提供一个我们认为不仅可行,而且已经过实际测试的查询。但要做到这一点,我们需要样本数据和预期结果)您可以查看我的结果并帮助我
SELECT DISTINCT I.ARTICLE,
FIRST_VALUE(i.DESCRIPTION) OVER (PARTITION BY i.ARTICLE ORDER BY LEN(i.DESCRIPTION) as DESCRIPTION,
I.TYPE,
SUM(CASE WHEN I.TYPE IN ('CONNECTOR','PROFILE') THEN (I.LENGTH * I.WIDTH)/1000000
END) OVER (PARTITION BY i.ARTICLE) AS QTY1,
SUM(CASE WHEN I.TYPE IN( 'CONNECTOR', 'SPP')
THEN 1 ELSE 0
END) OVER (PARTITION BY i.ARTICLE) AS QTY2k
FROM IDBMASTER AS I
WHERE I.ORDER_NAME IN ('2018003071') AND
I.TYPE = 'CONNECTOR'
ORDER BY I.ARTICLE ASC;