Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制sql时,选择2个值中的1个_Sql_Sql Server - Fatal编程技术网

复制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;