2014-01-29 91 views
1

我是SQL xml操作的新手。我在SQL解析中遇到了问题。SQL服务器XML解析到表

我有一个表名为Task。它有3列:

  • 名称
  • 任务
  • 日期

Task是以小时节约工作,如下格式的XML:

<TASK> 
    <A>1</A> 
    <B>4</B> 
    <C>0</C> 
</TASK> 

我的表会看起来像这样(有多名员工)

Name   | Task          | Date 
======================================================================== 
Employee2219 | <TASK><A>1</A><B>4</B><C>0</C></ TASK > | 2014-01-28 
Employee2219 | <TASK><A>3</A><B>2</B><C>1</C></ TASK > | 2014-01-29 
.... 

我需要计算个小时的职员花费为每个任务在一个星期内,如:

Name   | A | B | C | D 
=============================== 
Employee2219 | 4 | 6 | 1 | 0 
.... 

我是新来的XML,我无法来解决这一问题。

+0

“Task”列是实际的XML数据类型还是一些CHAR变体? – Bryan

+1

Prince Joseph T eh?这是否使我们成为你的奴才? :-) – Tanner

+0

丹纳它只是我的名字:) ..请帮助我解决这个 –

回答

2

这是简单的提取使用XQuery的XML:

SELECT 
    Name, 
    SUM(TaskA) AS ATotal, 
    SUM(TaskB) AS BTotal, 
    SUM(TaskC) AS CTotal, 
    SUM(TaskD) AS DTotal 
FROM 
(
    SELECT 
     t.NAME, 
     t.Date, 
     Nodes.node.value('(A)[1]', 'int') AS TaskA, 
     Nodes.node.value('(B)[1]', 'int') AS TaskB, 
     Nodes.node.value('(C)[1]', 'int') AS TaskC, 
     Nodes.node.value('(D)[1]', 'int') AS TaskD 
    FROM 
     TASK t 
     cross apply t.Task.nodes('/TASK') as Nodes(node) 
) x 
WHERE 
    [Date] BETWEEN '2014-01-01' AND '2014-01-07' -- Your week range 
GROUP BY 
    Name; 

SqlFiddle here

请发表您的问题以文字 - 许多企业因此用户从像imgur网站堵塞,所以回答变成猜测工作。

+0

这也将总结每个员工的价值? – Tanner

+0

基本上名称是员工ID,它可以出现多次,所以任务xml需要为每个员工ID汇总...但是,OP是不是很大 – Tanner

+0

非常感谢你StuartLC ..这是非常有益的..我们不能预测任务编号..它可能会改变..在那种情况下我们能做些什么..?在这种情况下,我们无法指定每个任务.. –