【问题标题】:How do I take the values of one record in a table and split it into multiple columns?如何获取表中一条记录的值并将其拆分为多列?
【发布时间】:2022-11-10 01:57:27
【问题描述】:

我有两个表,其中包含我需要使用的以下字段:

  • 主数据:Master_ID (PK)

  • 物品数据:Crate_ID、Master_ID (FK)、Item_Type_ID、Item_Type_Description、Item_Date

Item_Type_ID 有几个不同的数值,即 10、20、30、40、50 ... 100 ... 等。 每个数值代表一种类型,即蔬菜、水果、谷物、肉类等。

Item_Type_Description 是这样的:水果、蔬菜、谷物、肉类等。

Item_Date 是一个单一的日期,用于标识该特定项目(基于 Item_ID)何时添加到 Crate。

请注意,每个 Master_ID 只能有一个唯一的 Item_Type_ID。意思是,Item_Type_ID '10' 只能与 Master_ID '1234' 关联一次。一个 Item_Type_ID 可以与许多不同的 Master_ID 相关联,但每个 Master_ID 只能关联一次。

我遇到的问题是我可以获得组合结果,但是对于每个 Item_Type_ID,正在创建一个不同的记录/行。

这是我到目前为止生成的代码,它给了我不正确的结果:

USE Shipping
GO

BEGIN



SELECT
    vmi.master_id
    ,CASE
        WHEN vid.item_type_id = 10 THEN vid_item_date
        ELSE NULL
    END as 'Fruit_Item_Date'
    ,CASE
        WHEN vid.item_type_id = 20 THEN vid_item_date
        ELSE NULL
    END as 'Veggie_Item_Date'
    ,CASE
        WHEN vid.item_type_id = 30 THEN vid_item_date
        ELSE NULL
    END as 'Grains_Item_Date'
    ,CASE
        WHEN vid.item_type_id = 40 THEN vid_item_date
        ELSE NULL
    END as 'Meat_Item_Date'

FROM v_master_data vmi
LEFT JOIN v_item_data vid ON vmi.master_id = vid.master_id

WHERE vid.item_type_id IN (10,20,30,40)


END
GO

非常感谢任何输入、指示、帮助、方向、建议。

运行 SQL Server 2016,通过 SQL Server Management Studio v18 访问。

【问题讨论】:

  • 作为文本的示例数据和所需结果比图像更有帮助。也没有v18。选择@@version 将告诉您正在运行的版本。
  • 乍一看,您似乎正在寻找 PIVOT 甚至条件聚合
  • @JohnCappelletti,我很抱歉,MS SQL Server 2016,在 MS SQL Server Management Studio v18 上运行。将编辑我的帖子以添加文本示例而不是图像。
  • Please do not upload images of code/data/errors when asking a question. 另外,有问题要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源(指出我阅读一些材料的方向) 根据help center 准则是题外话。
  • @KenWhite 我很欣赏解释的链接。有趣的是,当我第一次阅读您的回复时,我最初的想法是:如果我们不应该上传图片,那么为什么要选择它呢?阅读帖子后,很明显OP的最初想法与我的一致,但提供的答案非常明确。再次感谢你。至于寻求建议,我只是建议,如果没有人能够/想要帮助为我所面临的问题提供答案,那么向我指出一些有见地的指导仍然会有所帮助。欣赏你的洞察力。 :)

标签: sql sql-server tsql


【解决方案1】:

也许这会给你一点推动

Select Master_ID
      ,Fruit_Date  = [10]
      ,Veggie_Date = [20]
      ,Grains_Date = [30]
      ,Meat_Date   = [40]
 From  (
        Select Master_ID
              ,Item_Type_ID
              ,Item_Date
         From  YourTable
       ) src
 Pivot ( max(Item_Date) for Item_Type_ID in ( [10],[20],[30],[40] ) ) pvt

条件聚合

Select Master_ID
      ,Fruit_Date  = max( case when Iten_Type_ID =10 then Item_Date end)
      ,Veggie_Date = max( case when Iten_Type_ID =20 then Item_Date end)
      ,Grains_Date = max( case when Iten_Type_ID =30 then Item_Date end)
      ,Meat_Date   = max( case when Iten_Type_ID =40 then Item_Date end)
 From  YourTable
 Group By Master_ID

条件聚合提供了更多的灵活性,并且通常性能更高。

【讨论】:

  • 约翰,非常感谢你的帮助。这就是我一直在寻找的。我根据我的完整场景调整了你的回答,每个人都提供了预期的结果。正如您所指出的,我不得不说,条件聚合确实提供了更多的灵活性并且更快地提供了结果。再次感谢你!
猜你喜欢
  • 1970-01-01
  • 2022-12-05
  • 2021-04-14
  • 2022-10-14
  • 2022-12-09
  • 1970-01-01
  • 2018-01-17
  • 2016-03-27
  • 2012-06-15
相关资源
最近更新 更多