SQL是否将列中的两个独立项组合在同一行中?

SQL是否将列中的两个独立项组合在同一行中?,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,嗨 我已经创建了一个框架切割列表报告,用于使用SQL see photo制作橱柜报告。我现在需要它,所以当左梯梁和右梯梁的长度和宽度相同时,将它们放在同一行,并将数量计算为2。。。简单地说,这样列表就不会那么长,而且更便于生产人员阅读 以下是迄今为止的SQL: SELECT CxMaterial.Name AS Material, Parts.[Cabinet ID], Parts.[Material ID], Count(Parts.[P

我已经创建了一个框架切割列表报告,用于使用SQL see photo制作橱柜报告。我现在需要它,所以当左梯梁和右梯梁的长度和宽度相同时,将它们放在同一行,并将数量计算为2。。。简单地说,这样列表就不会那么长,而且更便于生产人员阅读

以下是迄今为止的SQL:

SELECT CxMaterial.Name        AS Material,
       Parts.[Cabinet ID],
       Parts.[Material ID],
       Count(Parts.[Part ID]) AS Qty,
       Parts.[Width String],
       Parts.[Length String],
       Parts.Description,
       Parts.[Part ID],
       CxUnitOfIssue.Name     AS UnitOfIssue
FROM   ((Parts
       INNER JOIN CxMaterial
               ON Parts.[Material ID] = CxMaterial.ID)
       INNER JOIN CxUnitOfIssue
               ON CxMaterial.UnitOfIssueID = CxUnitOfIssue.ID)
       INNER JOIN CxPart
               ON Parts.[Part ID] = CxPart.ID
WHERE  ( ( ( Parts.BuyOut ) = False )
         AND ( ( CxPart.PartSubClassID ) = 6 ) )
GROUP  BY CxMaterial.Name,
          Parts.[Material ID],
          Parts.[Cabinet ID],
          Parts.Width,
          Parts.[Width String],
          Parts.Length,
          Parts.[Length String],
          Parts.Description,
          Parts.[Part ID],
          CxUnitOfIssue.Name
ORDER  BY Parts.[Cabinet ID],
          CxMaterial.Name,
          Parts.[Part ID] BETWEEN 1 AND 2,
          Parts.[Part ID] BETWEEN 3 AND 6,
          Parts.[Width String] DESC,
          Parts.[Length String] DESC 
例如,对于标识为“2”的机柜,左右侧梯梁的宽度和长度相同。。。因此,我希望这些在一行与'数量'2和'说明'左栏和右栏。这一切都是在Cabinet Vision软件中完成的。
谢谢。

根据反馈,很明显,提供的示例不是最低标准。我将为您提供一种方法,使您能够访问主请求,而不需要所有既不可用的表,也不需要结构或示例数据

让我们从引用提供的脚本开始。数据聚合存在一个概念问题。您不能按零件ID分组并期望左梯梁和右梯梁都有一条记录,因为它们的值不同。考虑到这一点,请看下面的内容:

DECLARE @SWAP TABLE ([CabinetId] INT NOT NULL, [MaterialId] INT NOT NULL, [Qty] INT NOT NULL, [WidthString] VARCHAR(50) NOT NULL, [LengthString] VARCHAR(50) NOT NULL, [Description] VARCHAR(250) NULL, [PartId] INT NOT NULL);
INSERT INTO @SWAP ([CabinetId], [MaterialId], [Qty], [WidthString], [LengthString], [Description], [PartId])
VALUES (1, 36, 1, 25, 2295, 'Left Stile', 2)
      ,(1, 36, 1, 25, 2285, 'Right Stile', 1)
      ,(1, 36, 1, 60, 620, 'Top Rail', 3)
      ,(1, 36, 1, 40, 620, 'Bottom Rail', 4)
      ,(2, 36, 1, 25, 2285, 'Left Stile', 2)
      ,(2, 36, 1, 25, 2285, 'Right Stile', 1)
      ,(2, 36, 1, 60, 620, 'Top Rail', 3)
      ,(2, 36, 1, 40, 620, 'Bottom Rail', 4);

SELECT P1.[CabinetId]
      ,P1.[MaterialId]
      ,[Qty] = SUM(P1.[Qty])
      ,P1.[WidthString]
      ,P1.[LengthString]
      ,[Description] = CASE WHEN P2.[CabinetId] IS NULL THEN P1.[Description] ELSE 'Left Stile & Right Stile' END
      --,P1.[PartId] -- *** CONCEPTUAL PROBLEM. YOU CANNOT AGGREGATE BY < PartID > ***

FROM @SWAP AS P1
    LEFT JOIN @SWAP AS P2
    ON P2.[CabinetId] = P1.[CabinetId]
        AND P2.[MaterialId] = P1.[MaterialId]
        AND P2.[WidthString] = P1.[WidthString]
        AND P2.[LengthString] = P1.[LengthString]
        AND P2.[Description] <> P1.[Description]
        AND P2.[Description] IN ('Left Stile', 'Right Stile')

GROUP BY P1.[CabinetId]
        ,P1.[MaterialId]
        ,P1.[WidthString]
        ,P1.[LengthString]
        ,CASE WHEN P2.[CabinetId] IS NULL THEN P1.[Description] ELSE 'Left Stile & Right Stile' END
        --,P1.[PartId] -- *** CONCEPTUAL PROBLEM. YOU CANNOT AGGREGATE BY < PartID > ***
您可以将此逻辑放在CTE内,并在CTE外执行其余的内部联接


希望这个想法能带你去你需要去的地方。。。快乐编码

让帮助你变得容易-简化!请避免粘贴图片,同时提供所需图片output@eshirvana现在应该更清楚了谢谢:请用您正在使用的DBMS标记您的问题