【问题标题】:SQL Group two separate items in a column together in same row?SQL将一列中的两个单独项目组合在同一行中?
【发布时间】:2021-07-07 13:37:02
【问题描述】:

嗨,

我创建了一个框架切割清单报告,用于使用 SQL 制作橱柜报告(见图)。我现在需要它,所以当左阶梯和右阶梯的长度和宽度相同时,将它们放在同一行并将数量计为 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 

例如。对于橱柜 ID '2',左右门梃的宽度和长度相同……所以我希望这些在一行中带有“数量”2 和“描述”左门梃和右门楣。这一切都在内阁视觉软件中完成。 谢谢。

【问题讨论】:

  • 轻松为您提供帮助 - 简化! minimal reproducible example
  • 请避免粘贴图片,同时提供所需的输出
  • @eshirvana 现在应该更清楚了,谢谢 :)
  • 请用您正在使用的 DBMS 标记您的问题

标签: sql sql-server sql-server-2012


【解决方案1】:

根据反馈,很明显提供的示例不是最低标准。我将向您介绍一种方法,将您带到您的“主要请求”,而不需要所有不可用的表格(结构和示例数据)。

让我们从引用提供的脚本开始。数据聚合存在概念问题。您不能按“零件 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 之外执行其余的内部连接。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2021-03-29
    • 2014-06-08
    • 1970-01-01
    • 2017-09-28
    相关资源
    最近更新 更多