2013-11-04 111 views
0

我有以下数据的表:拆分值成列

subitem, subitempart, subitemvalue 
'Badge", 'Issued to', 'abc' 
'Badge', 'Located at', 'bcd' 
'Badge, 'signed for', 'def' 
'key', 'number', '123' 
'key', 'Issued to', 'abc' 

的subitempart名称是从一个单独的表具有两个字段:[代码]和[描述]。 子项目可以有1到20个子项目,每项不同。

我的客户希望看到这个如下:

[Subitem], [Issued to], [Located at], [Signed for], [Number] 
'Badge' , 'abc'  , 'bcd'  , 'def'  , NULL 
'key' , 'abc'  , NULL  , NULL  , '123' 

所以我想要做的,是把提供给列的所有subitemparts,然后把这些值在正确的领域,然后删除在列每行都空着。

这是可能的MS SQL,如果是的话,如何?

在此先感谢您的帮助。

rg。 埃里克

+0

埃里克嗨,试图给看看这个http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx – Raphael

+0

你好谢谢。事实上,我确实看过那个页面,但不能将它与我的具体问题联系起来。 – Eric

+0

等一下,我给你写一个例子,告诉你如何将它与你的问题联系起来;) – Raphael

回答

0

看起来像你试图摆动你的结果。一种选择是使用PIVOT命令。我的理解是更好的使用MAXCASE虽然:

select subitem, 
    max(case when subitempart = 'Issued to' then subitemvalue end) IssuedTo, 
    max(case when subitempart = 'Located at' then subitemvalue end) LocatedAt, 
    max(case when subitempart = 'signed for' then subitemvalue end) SignedFor, 
    max(case when subitempart = 'number' then subitemvalue end) number 
from yourtable 
group by subitem 
+0

嗨,谢谢,但是可以通过添加新的或删除旧的子表来改变子表的内容。我不想在每次发生时都编辑查询,所以我需要一个更动态的解决方案。 – Eric

0

您可以将数据透视表,在SQL它并不难。

SELECT * FROM item 
PIVOT (max(subitemvalue) 
    for subitempart in ([Issued to],[Located at],[signed to],[number])) as items 

希望这有助于

+0

谢谢,但我怎样才能使它更具活力。我希望查询也可以在用户添加新的subitempart时起作用。 – Eric

+1

这是有点棘手检查这个帖子http://stackoverflow.com/questions/11985796/sql-server-pivot-dynamic-columns-no-aggregation这是它是如何工作的,我们使用这种方法来做动态数据透视 – Raphael