按 xml 查询的结果分组

rek*_*ire 1 xml sql t-sql group-by sqlxml

我有一个带有 XML 列(称为元数据)的表,如下所示:

\n\n
<props>\n  <prop name="bytes" value="194" />\n  <prop name="error" value="File is a text file" />\n  <prop name="mime-type" value="text/plain " />\n</props>\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我有一些不同的错误,我可以在这里选择:

\n\n
SELECT MetaData.value(\'(/props/prop[@name="error"]/@value)[1]\', \'varchar(50)\') Error,\n       MetaData.value(\'(/props/prop[@name="mime-type"]/@value)[1]\', \'varchar(50)\') MimeType,\n       *\nFROM source\nWHERE MetaData.exist(\'/props/prop[@name="error"]\') = 1\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我想计算错误发生的频率:

\n\n
SELECT MetaData.value(\'(/props/prop[@name="error"]/@value)[1]\', \'varchar(50)\') Error,\n       COUNT(*) Count\nFROM source\nWHERE MetaData.exist(\'/props/prop[@name="error"]\') = 1\nGROUP BY Error\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我收到错误消息:

\n\n
\n

Meldung 207、Ebene 16、状态 1、Zeile 5
\n Ung\xc3\xbcltiger Spaltenname \'错误\'。

\n
\n\n

这意味着类似:无效的列名\'错误\'

\n\n

我也在这里尝试过:

\n\n
Select Error, COUNT(Error) FROM (\n    SELECT MetaData.value(\'(/props/prop[@name="error"]/@value)[1]\', \'varchar(50)\') Error\n    FROM videos\n    WHERE MetaData.exist(\'/props/prop[@name="error"]\') = 1\n)\nGROUP BY Error\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这会崩溃:

\n\n
\n

Meldung 156、Ebene 15、Status 1、Zeile 6
\n Falsche 语法位于 N\xc3\xa4he des GROUP-Schl\xc3\xbcsselworts 中。

\n
\n\n

这意味着类似:关键字 GROUP 附近的语法错误

\n\n

我该如何解决这个问题?

\n

Ric*_*iwi 5

唯一一次可以在同一查询中引用别名列是在 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
Run Code Online (Sandbox Code Playgroud)

AndCount是一个保留字,因此如果要使用它,则需要将其放在方括号中。