Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 每个库存项目的前3项记录_Sql_Sql Server - Fatal编程技术网

Sql 每个库存项目的前3项记录

Sql 每个库存项目的前3项记录,sql,sql-server,Sql,Sql Server,我们有一个存储过程,它逐行遍历选定的库存项目,并用每个库存项目的3个最新销售订单号填充一个表: INSERT INTO TOP3_STOCK_SALES_DATA ( ORDERDATE , SEQNO , STOCKCODE , QUANTITY , ROW ) SELECT TOP 3 h.ORDERDATE ,

我们有一个存储过程,它逐行遍历选定的库存项目,并用每个库存项目的3个最新销售订单号填充一个表:

INSERT  INTO TOP3_STOCK_SALES_DATA
        ( ORDERDATE ,
          SEQNO ,
          STOCKCODE ,
          QUANTITY ,
          ROW
        )
        SELECT TOP 3
                h.ORDERDATE ,
                h.SEQNO ,
                l.STOCKCODE ,
                l.ORD_QUANT ,
                ROW_NUMBER() OVER ( ORDER BY h.ORDERDATE DESC, h.SEQNO DESC ) AS row
        FROM    SALESORD_HDR h ,
                SALESORD_LINES l
        WHERE   l.HDR_SEQNO = h.SEQNO
                AND l.STOCKCODE IN ( '1000-ACQ45' )
        ORDER BY h.ORDERDATE DESC ,
                h.SEQNO DESC

是否有办法运行此语句或批量而不是逐行获得相同的结果?

您的书面查询不会返回每个库存项目的前3条记录,但只返回返回结果集中的前3条记录。要获得每个库存项目的前3名,请参见下文

INSERT  INTO TOP3_STOCK_SALES_DATA
        ( ORDERDATE ,
          SEQNO ,
          STOCKCODE ,
          QUANTITY ,
          ROW
        )
SELECT   A.ORDERDATE 
        ,A.SEQNO 
        ,A.STOCKCODE 
        ,A.ORD_QUANT
        ,A.row 
FROM (
        SELECT 
                h.ORDERDATE ,
                h.SEQNO ,
                l.STOCKCODE ,
                l.ORD_QUANT ,
                ROW_NUMBER() OVER (PARTITION BY l.STOCKCODE ORDER BY h.ORDERDATE DESC, h.SEQNO DESC ) AS row
        FROM    SALESORD_HDR h 
        INNER JOIN  SALESORD_LINES l   ON   l.HDR_SEQNO = h.SEQNO
       ) A
WHERE ROW <= 3

能否添加一些示例数据以及结果应该是什么?请解释“批量”和“逐行”的含义,以及为什么要将后者转换为前者。insert语句一次针对一个股票代码执行。假设我有25个股票代码要处理,我希望能够在一个insert语句中处理所有25个股票代码。它将获得每个股票代码的最近3个销售订单,即一次插入75行。我还没有完全测试过它,但看起来它完美地回答了我的问题-谢谢!我不知道如何批量完成。出于兴趣,我可以问你为什么要用这种方式编码连接吗?l.HDR上的内部连接线l\U SEQNO=h.SEQNO。这是个人偏好,还是有性能优势?这不是批量插入,批量插入在sql server中是一个不同的概念,但读了您的问题后,我猜您是在寻找这个解决方案,无论如何,很高兴它有所帮助:您连接两个表的方式是一种有效的语法,但它是连接的唯一语法,我已经将其更改为使用ON子句和关键字innerjoin的较新的join语法。这是首选语法:谢谢:我已经好几年没有使用SQL了,所以我很想看看在此期间发生了什么变化