Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 Server 2008和使用不同行数计算不同表中的行_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql Server 2008和使用不同行数计算不同表中的行

Sql Server 2008和使用不同行数计算不同表中的行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,你好。有人知道如何从不同的表中提取具有不同行数的数据吗 我从3个表中调用,其中一个表中的每个对应ID有多行。我需要选择每个ID的前6行,但我要加入的表有多个具有相同ID的行。我需要这些排。所以我需要列出前6行,但实际上可能不止6行。我的示例代码如下。我将此发送到VB和 它希望看到6批数据,但每批数据的行数不同。这是我的程序谢谢 注意**我遇到的问题是,当我运行这个队列时,它会给我6行,但如果RPG的配置文件ID有3行,那么我将得到6行,但有2个配置文件ID。我需要限制PK_RoasterQueu

你好。有人知道如何从不同的表中提取具有不同行数的数据吗

我从3个表中调用,其中一个表中的每个对应ID有多行。我需要选择每个ID的前6行,但我要加入的表有多个具有相同ID的行。我需要这些排。所以我需要列出前6行,但实际上可能不止6行。我的示例代码如下。我将此发送到VB和 它希望看到6批数据,但每批数据的行数不同。这是我的程序谢谢

注意**我遇到的问题是,当我运行这个队列时,它会给我6行,但如果RPG的配置文件ID有3行,那么我将得到6行,但有2个配置文件ID。我需要限制PK_RoasterQueueSequenceID具有6个不同ID的行或其他内容,但每个行可能不止一行。所以有超过6行,但按日期排序限制为6个ID…如果这有意义的话

注*这就像我想要从表中复制,但我不想让它们计入我的行数

    USE [Product];


GO
SET ANSI_NULLS ON;


GO
SET QUOTED_IDENTIFIER ON;


GO
ALTER PROCEDURE [Controls].[spTestGETBatchToPLC]
@SuperSackID INT OUTPUT, @POINTER1 INT
AS
SET NOCOUNT OFF;
DECLARE @PublishedStartDateTime AS SMALLDATETIME, 
@Fk_RoasterQueueSequenceID AS INT, 
@Pk_RoasterQueueSequenceID AS INT, 
@RETURN AS INT;
IF @POINTER1 = 1
    BEGIN
        SELECT   TOP 6 PK_RoasterQueueSequenceID,
                       RoasterNumber,
                       RoastProfile,
                       RoastDescription,
                       ChargeWeight
        FROM     wip.RoasterQueueSequence AS TRQS
                 INNER JOIN
                 wip.schedule AS s
                 ON s.fk_roasterqueuesequenceid = TRQS.PK_RoasterQueueSequenceID
        -- inner join Specification.RoastProfileGreenBeanComponents RPG on (****This is where there my or maynot be more than one row with the same RoastProfileID) RPG.PK_RoastProfileID = trqs.RoastProfile 
        WHERE    Trqs.Status = 'Queued'
                 AND Trqs.PK_RoasterQueueSequenceID = s.FK_RoasterQueueSequenceID
                 AND Trqs.RoasterNumber = 6
        ORDER BY s.publishedstartdatetime ASC;
        SELECT   PublishedStartDateTime,
                 FK_RoasterQueueSequenceID,
                 wip.RoasterQueueSequence.PK_RoasterQueueSequenceID,
                 wip.RoasterQueueSequence.RoasterNumber,
                 wip.RoasterQueueSequence.RoastProfile,
                 wip.RoasterQueueSequence.RoastDescription,
                 wip.RoasterQueueSequence.ChargeWeight,
                 Specification.RoastProfileGreenBeanComponents.GreenBeanPercentOfCharge,
                 Specification.RoastProfileGreenBeanComponents.partno,
                 Specification.RoastProfileGreenBeanComponents.PK_RoastProfileID
        FROM     wip.Schedule, wip.RoasterQueueSequence, Specification.RoastProfileGreenBeanComponents
        WHERE    wip.RoasterQueueSequence.Status = 'Queued'
                 AND wip.roasterqueuesequence.RoastProfile = specification.RoastProfileGreenBeanComponents.PK_RoastProfileID
                 AND wip.RoasterQueueSequence.PK_RoasterQueueSequenceID = wip.Schedule.FK_RoasterQueueSequenceID
                 AND wip.RoasterQueueSequence.RoasterNumber = 6
        ORDER BY PublishedStartDateTime;
        SELECT @RETURN = @@rowcount
        FROM   WIP.RoasterQueueSequence;
    END

一种方法是使用CTE和行数函数。基本方法是对FK表中的每条记录进行编号,即在主键上对一对多关系商店中的多条记录进行编号,然后删除每条记录,在本例中,编号高于阈值7。您还可以使用GROUP BY来确定要包括哪些PK记录。例如,假设我们正在处理订单和订单项,您的查询将如下所示:

;WITH myCTE AS (
    SELECT 
         OrderDetailID,
         OrderID,
         ROW_NUMBER() OVER (PARTITION BY OrderID ORDER BY OrderDetailID)
            as [OrderItemCount]
    FROM OrderDetails
) 
SELECT * 
FROM myCTE 
WHERE 
    --Get up to 7 details
    OrderItemCount < 8
    --Get up to 6 orders
    AND OrderID IN (
       SELECT TOP 6 OrderID FROM myCTE GROUP BY OrderID ORDER BY OrderID DESC
    )
ORDER BY
    --Most recent orders first
    OrderID DESC

一种方法是使用CTE和行数函数。基本方法是对FK表中的每条记录进行编号,即在主键上对一对多关系商店中的多条记录进行编号,然后删除每条记录,在本例中,编号高于阈值7。您还可以使用GROUP BY来确定要包括哪些PK记录。例如,假设我们正在处理订单和订单项,您的查询将如下所示:

;WITH myCTE AS (
    SELECT 
         OrderDetailID,
         OrderID,
         ROW_NUMBER() OVER (PARTITION BY OrderID ORDER BY OrderDetailID)
            as [OrderItemCount]
    FROM OrderDetails
) 
SELECT * 
FROM myCTE 
WHERE 
    --Get up to 7 details
    OrderItemCount < 8
    --Get up to 6 orders
    AND OrderID IN (
       SELECT TOP 6 OrderID FROM myCTE GROUP BY OrderID ORDER BY OrderID DESC
    )
ORDER BY
    --Most recent orders first
    OrderID DESC

我认为您只需要使用子查询从RoasterQueueSequence中获取前6条记录,并将结果连接到其他表

select x.*,...
from
(SELECT TOP 6 PK_RoasterQueueSequenceID,
                       RoasterNumber,
                       RoastProfile,
                       RoastDescription,
                       ChargeWeight
        FROM     wip.RoasterQueueSequence AS TRQS
        INNER JOIN 
                 wip.schedule AS s
                 ON s.fk_roasterqueuesequenceid = TRQS.PK_RoasterQueueSequenceID
        WHERE    Trqs.Status = 'Queued'
                 AND Trqs.PK_RoasterQueueSequenceID = s.FK_RoasterQueueSequenceID
                 AND Trqs.RoasterNumber = 6
) as x
inner join ...

我认为您只需要使用子查询从RoasterQueueSequence中获取前6条记录,并将结果连接到其他表

select x.*,...
from
(SELECT TOP 6 PK_RoasterQueueSequenceID,
                       RoasterNumber,
                       RoastProfile,
                       RoastDescription,
                       ChargeWeight
        FROM     wip.RoasterQueueSequence AS TRQS
        INNER JOIN 
                 wip.schedule AS s
                 ON s.fk_roasterqueuesequenceid = TRQS.PK_RoasterQueueSequenceID
        WHERE    Trqs.Status = 'Queued'
                 AND Trqs.PK_RoasterQueueSequenceID = s.FK_RoasterQueueSequenceID
                 AND Trqs.RoasterNumber = 6
) as x
inner join ...

您实际使用的数据库是什么?对于第一个select,您是否希望返回每个RoasterQueueSequence记录的前6个计划记录?此查询可以返回的最大记录数是多少?36 6*6?6*7,以便规格表可能具有相同的配置文件ID 7不同的时间7不同的零件号和收费百分比。@ENGR024请参阅下面我的答案。今晚晚些时候,我将尝试使用您的样本数据来整理一些内容。如果您设置了一个SQLFIDLE,这也会很有帮助。这将非常有帮助。我将不胜感激。我正在尝试使用您提供给我的以下示例。我只是有点卡住了,因为我在CTE中包含了3个表,而且出于某种原因SQL不喜欢我调用过程的方式。感谢您的时间。您实际使用的数据库是什么?对于第一个选择,您是否希望返回每个RoasterQueueSequence记录的前6个计划记录?此查询可以返回的最大记录数是多少?36 6*6?6*7,以便规格表可能具有相同的配置文件ID 7不同的时间7不同的零件号和收费百分比。@ENGR024请参阅下面我的答案。今晚晚些时候,我将尝试使用您的样本数据来整理一些内容。如果您设置了一个SQLFIDLE,这也会很有帮助。这将非常有帮助。我将不胜感激。我正在尝试使用您提供给我的以下示例。我只是有点卡住了,因为我在CTE中包含了3个表,而且出于某种原因SQL不喜欢我调用过程的方式。谢谢你抽出时间