[英]Split comma separated column data into additional columns which has more than 50 fields
[英]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
是否有可能做到这一点?
请教给我
我将创建三个表。 Food
, Ingredients
和Food
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
将这两个列都设为“ Food
和Ingredient
表的外键”表。
按照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.