sql-server 如何获取表中一条记录的值并将其拆分为多个列?

fafcakar  于 2022-10-31  发布在  其他
关注(0)|答案(1)|浏览(120)

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

  • 主数据:主标识(主键)
  • 物料数据:板条箱标识、主标识(FK)、物料类型标识、物料类型说明、物料日期

Item_Type_ID有几个不同的数值,例如10、20、30、40、50... 100...等。每个数值代表一种类型,例如蔬菜、水果、谷物、肉类等。
Item_Type_Description的内容如下:水果、蔬菜、谷物、肉类等
Item_Date是标识该特定物品(基于Item_ID)何时被添加到板条箱的单个日期。
请注意,每个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管理工作室v18访问。

j9per5c4

j9per5c41#

也许这会给予你一点提示

枢轴

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

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

相关问题