
我想写一个查询,它会给出两列:
1> 查询类型 2> 计数
此结果集应具有以下结构

这里应该预定义第一列的值,并且必须计算计数。我想检查源表的请求列并找到特定的模式。如果找到该模式,则增加计数。
例如 :
如果在请求列中找到单词“greenhopper”,则属于类型 GREENHOPPER 。
或者
如果找到一个单词“gadgets”,它是 DASHBOARD 类型。等等 ...
所以想通过日志表来分析一下各个类别的使用情况。
因此,最后我可以得到使用量,然后我可以用它构建一个饼图。

我想写一个查询,它会给出两列:
1> 查询类型 2> 计数
此结果集应具有以下结构

这里应该预定义第一列的值,并且必须计算计数。我想检查源表的请求列并找到特定的模式。如果找到该模式,则增加计数。
例如 :
如果在请求列中找到单词“greenhopper”,则属于类型 GREENHOPPER 。
或者
如果找到一个单词“gadgets”,它是 DASHBOARD 类型。等等 ...
所以想通过日志表来分析一下各个类别的使用情况。
因此,最后我可以得到使用量,然后我可以用它构建一个饼图。
SELECT 'Greenhopper' AS TypeOfQuery, COUNT(*) AS Cnt
FROM YourTable
WHERE Request LIKE '%Greenhopper%'
UNION ALL
SELECT 'Dashboard', COUNT(*)
FROM YourTable
WHERE Request LIKE '%gadgets%'
-- And so forth
你说它们是预定义的对吗?因此,您将有大约 10 种不同UNION的陈述。
WITH Requests AS
(
SELECT
CASE
WHEN Request LIKE '%Greenhopper%' THEN 'GreenHopper'
WHEN Request LIKE '%gadgets%' THEN 'Gadgets'
-- and so on
ELSE 'Misc'
END RequestType
FROM YourTable
)
SELECT
RequestType,
COUNT(*) RequesCount
FROM Requests
GROUP BY RequestType
;
没有要测试的数据,但我相信这种方法会表现得更好,因为扫描表的次数会更少。由于 LIKE 和第一个通配符,性能永远不会理想。这将防止搜索。
进一步解释为什么 LIKE 不在这里执行
刚刚重新查看了这个问题,您可以通过更改搜索字符串来进一步提高性能,使其右侧只有一个通配符
例如 LIKE 'GET /rest/gadget%' 等等。