【问题标题】:Multiple rows with one duplicate value to columns多行,列有一个重复值
【发布时间】:2017-12-18 06:07:58
【问题描述】:

ORG_ITEM 表包含重复的 ID。这些 ID 显示相同 ID 的不同 MFR 和 PART_NO。这导致我的查询返回具有相同 ID 的多行。如何将这些行放入一行中,每个 MFR 和 PART_NO 作为单独的列?

SELECT
PART_LOC.CLASS,
PART_LOC.ID,
ORG.MFR,
ORG_ITEM.PART_NO,
PART_LOC.STORAGE_LOC,
PART_LOG.QTY,
COST.UNIT_COST

FROM
PART_LOC
LEFT JOIN COST on PART_LOC.ID = COST.ID
LEFT JOIN ORG_ITEM on PART_LOC.ID = ORG_ITEM.ID
LEFT JOIN ORG on ORG_ITEM.MFR = ORG.MFR

WHERE
PART_LOC.STORAGE_LOG = :Facility

目前返回:

CLASS   ID      MFR      PART_NO   STORAGE_LOC  QTY    COST
  3    1234   Grainger    123F6       CRIB       6    12.67
  3    1234   Hagerty     asd45       CRIB       6    12.67
  3    1234     MSC       poi98       CRIB       6    12.67

希望它返回:

CLASS   ID   MFR-PART_NO1   MFR-PART_NO2   MFR-PART_NO3  STORAGE_LOC  QTY COST
  3    1234 Grainger-123F6  Hagerty-asd45    MSC-poi98      CRIB       6  12.67

【问题讨论】:

  • 使用rextester.com/l/oracle_online_compiler 然后用 cmets 在底部添加寻找。然后重新发布链接。设置一个包含一些数据的表
  • 不是每个人都可以访问外部图片网站:如果您发布屏幕截图而不是输入文本,您可能会减少可以帮助您的人数。虽然在这种情况下没关系,因为这个问题是一个老栗子。请搜索oracle + pivot,你会找到对你有帮助的东西
  • 我能够重新编辑并将链接转换为图像。 @Brco 了解它也插入图像的编辑器...
  • @JGFMK 已编辑以删除图像插入。
  • 如果事先不知道制造商的数量,你不能用标准的SQL来做到这一点。您可以使用动态 SQL,这完全不同(尽管名称不同)并且通常被认为是一种糟糕的做法。为什么需要这种格式的结果?您当前的输出有什么问题?

标签: sql oracle multiple-results


【解决方案1】:

你可以试试这样的。对于每个 ID,我假设最多有五个制造商。我还假设您不在乎制造商的显示顺序。如果您确实关心(例如,如果您希望它们在每一行中按字母顺序从左到右排列),您可以在我添加到内部查询的 ROW_NUMBER() 函数中添加排序条件;现在它显示“order by null”(这意味着您对订单无动于衷)。

如果每个 ID 有超过 5 个制造商,此查询仍然有效;输出中只会显示五个制造商(六个、八个或十个)。

select class, id, mfr_part1, mfr_part2, mfr_part3, mfr_part4, mfr_part5, 
       storage_loc, qty, unit_cost
from   (
  SELECT
  PART_LOC.CLASS,
  PART_LOC.ID,
  ORG.MFR,
  ORG_ITEM.PART_NO,
  PART_LOC.STORAGE_LOC,
  PART_LOG.QTY,
  COST.UNIT_COST,
  row_number() over (partition by part_loc.id order by null) as RN
  FROM
  PART_LOC
  LEFT JOIN COST on PART_LOC.ID = COST.ID
  LEFT JOIN ORG_ITEM on PART_LOC.ID = ORG_ITEM.ID
  LEFT JOIN ORG on ORG_ITEM.MFR = ORG.MFR
  WHERE
  PART_LOC.STORAGE_LOG = :Facility
  )
pivot ( max(mfr || '-' || part_no)
        for RN in (1 as mfr_part1, 2 as mfr_part2, 3 as mfr_part3,
                   4 as mfr_part4, 5 as mfr_part5)
      )
;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2017-10-30
    • 2012-01-20
    • 1970-01-01
    • 2018-12-15
    • 2022-07-11
    • 2023-03-20
    相关资源
    最近更新 更多