Sql 按xml查询的结果分组
我有一个带有XML列(称为元数据)的表,它如下所示:Sql 按xml查询的结果分组,sql,xml,tsql,group-by,sqlxml,Sql,Xml,Tsql,Group By,Sqlxml,我有一个带有XML列(称为元数据)的表,它如下所示: <props> <prop name="bytes" value="194" /> <prop name="error" value="File is a text file" /> <prop name="mime-type" value="text/plain " /> </props> SELECT error, COUNT(*) errorCount FROM
<props>
<prop name="bytes" value="194" />
<prop name="error" value="File is a text file" />
<prop name="mime-type" value="text/plain " />
</props>
SELECT error, COUNT(*) errorCount
FROM
(
SELECT
e.c.value ('@value', 'varchar(50)') Error
FROM source s
CROSS APPLY s.metadata.nodes('props/prop[@name="error"]') e(c)
) x
GROUP BY error
现在我想计算一下错误发生的频率:
SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error,
COUNT(*) Count
FROM source
WHERE MetaData.exist('/props/prop[@name="error"]') = 1
GROUP BY Error
但我得到了错误信息:
梅尔敦207号,埃本16号,状态1号,泽勒5号Ungültiger Spaltenname“错误” 这意味着:无效的列名“Error” 我在这里也试过:
SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error,
MetaData.value('(/props/prop[@name="mime-type"]/@value)[1]', 'varchar(50)') MimeType,
*
FROM source
WHERE MetaData.exist('/props/prop[@name="error"]') = 1
Select Error, COUNT(Error) FROM (
SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error
FROM videos
WHERE MetaData.exist('/props/prop[@name="error"]') = 1
)
GROUP BY Error
但这与:
梅尔敦156号,埃本15号,状态1号,泽勒6号《施吕塞尔运动团体》中的法氏语法 这意味着:关键字组附近的语法错误
如何解决该问题?在同一查询中唯一可以引用别名列的时间是在ORDER BY子句中。上次尝试时出现的错误是,必须为子查询指定一个表别名,由于缺少更好的名称,我在下面使用了“X”
SELECT Error, COUNT(Error) [Count]
FROM (
SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error
FROM source
WHERE MetaData.exist('/props/prop[@name="error"]') = 1
) X
GROUP BY Error
而
Count
是一个保留字,因此如果要使用它,您需要将其放在方括号中。在同一查询中唯一可以引用别名列的时间是在ORDER BY子句中。上次尝试时出现的错误是,必须为子查询指定一个表别名,由于缺少更好的名称,我在下面使用了“X”
SELECT Error, COUNT(Error) [Count]
FROM (
SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error
FROM source
WHERE MetaData.exist('/props/prop[@name="error"]') = 1
) X
GROUP BY Error
而
Count
是一个保留字,因此如果要使用它,需要将其放在方括号中。在第二个查询中,需要命名子查询
Select Error, COUNT(Error) FROM
(
SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error
FROM videos
WHERE MetaData.exist('/props/prop[@name="error"]') = 1
) subqueryname
GROUP BY Error
你可以给它取任何你喜欢的名字 在第二个查询中,需要命名子查询
Select Error, COUNT(Error) FROM
(
SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error
FROM videos
WHERE MetaData.exist('/props/prop[@name="error"]') = 1
) subqueryname
GROUP BY Error
你可以给它取任何你喜欢的名字 正确。你也可以这样说:
<props>
<prop name="bytes" value="194" />
<prop name="error" value="File is a text file" />
<prop name="mime-type" value="text/plain " />
</props>
SELECT error, COUNT(*) errorCount
FROM
(
SELECT
e.c.value ('@value', 'varchar(50)') Error
FROM source s
CROSS APPLY s.metadata.nodes('props/prop[@name="error"]') e(c)
) x
GROUP BY error
您也可以使用XQuery来实现这一点,尽管还不清楚您希望预期结果的外观。试试这个:
DECLARE @source TABLE ( metadata XML )
INSERT INTO @source
SELECT '<props>
<prop name="bytes" value="194" />
<prop name="error" value="File is a text file" />
<prop name="mime-type" value="text/plain " />
</props>'
INSERT INTO @source
SELECT '<props>
<prop name="bytes" value="0" />
<prop name="error" value="error 1" />
<prop name="error" value="error 2" />
<prop name="mime-type" value="text/plain " />
</props>'
SELECT
MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error,
MetaData.value('(/props/prop[@name="mime-type"]/@value)[1]', 'varchar(50)') MimeType,
MetaData.value('count(/props/prop[@name="error"])', 'int') errorCount,
*
FROM @source
WHERE MetaData.exist('/props/prop[@name="error"]') = 1
DECLARE@source表(元数据XML)
插入@source
选择'
'
插入@source
选择'
'
挑选
MetaData.value('(/props/prop[@name=“error”]/@value)[1]','varchar(50)'错误,
MetaData.value('(/props/prop[@name=“mime type”]/@value)[1],'varchar(50)')MimeType,
MetaData.value('count(/props/prop[@name=“error”]),'int')errorCount,
*
来自@source
其中MetaData.exist('/props/prop[@name=“error”]')=1
正确。你也可以这样说:
<props>
<prop name="bytes" value="194" />
<prop name="error" value="File is a text file" />
<prop name="mime-type" value="text/plain " />
</props>
SELECT error, COUNT(*) errorCount
FROM
(
SELECT
e.c.value ('@value', 'varchar(50)') Error
FROM source s
CROSS APPLY s.metadata.nodes('props/prop[@name="error"]') e(c)
) x
GROUP BY error
您也可以使用XQuery来实现这一点,尽管还不清楚您希望预期结果的外观。试试这个:
DECLARE @source TABLE ( metadata XML )
INSERT INTO @source
SELECT '<props>
<prop name="bytes" value="194" />
<prop name="error" value="File is a text file" />
<prop name="mime-type" value="text/plain " />
</props>'
INSERT INTO @source
SELECT '<props>
<prop name="bytes" value="0" />
<prop name="error" value="error 1" />
<prop name="error" value="error 2" />
<prop name="mime-type" value="text/plain " />
</props>'
SELECT
MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error,
MetaData.value('(/props/prop[@name="mime-type"]/@value)[1]', 'varchar(50)') MimeType,
MetaData.value('count(/props/prop[@name="error"])', 'int') errorCount,
*
FROM @source
WHERE MetaData.exist('/props/prop[@name="error"]') = 1
DECLARE@source表(元数据XML)
插入@source
选择'
'
插入@source
选择'
'
挑选
MetaData.value('(/props/prop[@name=“error”]/@value)[1]','varchar(50)'错误,
MetaData.value('(/props/prop[@name=“mime type”]/@value)[1],'varchar(50)')MimeType,
MetaData.value('count(/props/prop[@name=“error”]),'int')errorCount,
*
来自@source
其中MetaData.exist('/props/prop[@name=“error”]')=1
哦,不,只是上次尝试时缺少了X
。谢谢哦,不,只是我上次尝试时丢失了X
。谢谢我想要一个错误消息和计数的列表。例如,未找到文件:3次。读取错误:10次,以此类推。如果我猜对了,您的sql语句将返回名为error right的prop
s的计数?我想要一个错误消息和计数的列表。例如,未找到文件:3次。读取错误:10次,以此类推。如果我猜对了,您的sql语句将返回prop
s的计数,并返回名称错误,对吗?