繁体   English   中英

当列元素具有多个数据时如何动态创建新列

[英]How to dynamically create new columns when column elements has more than 1 data

当我选择数据时,我正在尝试动态添加新表,假设我的sql数据库具有

Food       ingredients
----------------------
sandwich   Bread
sandwich   Butter
sandwich   Jam

但是我不希望它在使用select命令时那样显示,我希望它看起来像这样

Food       ingredients      ingredients2       ingredients3
------------------------------------------------------------
sandwich   Bread            Butter             Jam

是否有可能做到这一点?

请教给我

我将创建三个表。 FoodIngredientsFood Food_Ingredients Ingredients


餐桌Food应该看起来像....

FoodID     FoodName 
  1        sandwich
  2        Omelet 

FoodID设为主键


Ingredient应该看起来像....

IngredientID    IngredientName
     1           Bread
     2           Butter
     3           Jam
     4           Egg
     5           Oil

使IngredientID为主键。


最后, Food_Ingredients应该看起来像

FoodID   IngredientID
   1         1
   1         2
   1         3
   2         4
   2         2

将这两个列都设为“ FoodIngredient表的外键”表。

按照M.Ali的答案中的建议检查数据库设计可能是一个好主意,但是,如果您只是想以某种方式检索数据,那么下面的查询将为您服务。 请注意,它绝不是动态的,因此,如果您需要更多列,则必须手动添加它们。 不过,可以以动态方式生成列。

select food, ingredient1, ingredient2, ingredient3
from (
    select 
       food,
       ingredients, 
       concat('ingredient', row_number() over (partition by food order by ingredients)) as cols
    from foodstuff
) t
pivot (
    max(ingredients) for cols in ([ingredient1],[ingredient2],[ingredient3]) 
) as p

输出:

food        ingredient1  ingredient2    ingredient3
sandwich    Bread        Butter         Jam

这使用注入编码(请仔细阅读潜在的安全风险)。 还要将@jpw的贡献归功于我以前基于该代码做出的贡献。 该代码允许增加或减少成分数量,并将进行调整。

DECLARE @col AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
select @col = STUFF((SELECT distinct ',' +
                    QUOTENAME('ingredients'+cast(row_number () over (partition by food order by ingredients) as varchar (max)))
                  FROM ##t1
                  FOR XML PATH(''), TYPE
                 ).value('.', 'NVARCHAR(MAX)') 
                    , 1, 1, '')
 ;
 select @query =
 '
 select food, ' + @col + '
   from (
         select 
           food,
           ingredients, 
           ''ingredients''+ cast(row_number() over (partition by food order by ingredients)as varchar (10)) as cols
         from foodstuff
         ) t
 pivot (
        max(ingredients) for cols in (' + @col + ') 
        ) as p
 ;'
 ;
execute(@query);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM