【发布时间】:2020-01-21 21:13:09
【问题描述】:
SELECT DISTINCT *
FROM
(SELECT dbtables.[name] as 'back_end_name',
CASE
WHEN dbtables.[name] LIKE '_Result%' AND CAST(RIGHT(dbtables.[name], LEN(dbtables.[name]) - 7) AS int) = CalculationID
THEN Calculation.Name
WHEN dbtables.[name] LIKE '_History%'
THEN
CASE
WHEN LEN(dbtables.[name]) = 9 AND CAST(RIGHT(dbtables.[name], 1) AS int) = HistoryID
THEN HistoryMap.TableName
WHEN LEN(dbtables.[name]) = 10 AND CAST(RIGHT(dbtables.[name], 2) AS int) = HistoryID
THEN HistoryMap.TableName
WHEN LEN(dbtables.[name]) = 11 AND CAST(RIGHT(dbtables.[name], 3) AS int) = HistoryID
THEN HistoryMap.TableName
ELSE 'N/A'
END
ELSE 'N/A'
END AS front_end_name,
indexstats.avg_fragmentation_in_percent,
indexstats.page_count,
indexstats.record_count
FROM Calculation, HistoryMap, sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, 'Sampled') AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
WHERE indexstats.database_id = DB_ID() AND indexstats.avg_fragmentation_in_percent >= 30) tmp
WHERE front_end_name NOT LIKE '%N/A%'
我有以下有效的查询,但是当我只需要 1 个实例时,“front_end_name”中的一些数据重复,所以我在最后添加了“GROUP BY front_end_name”,但它返回错误“Column 'tmp.back_end_name ' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中”。为什么现在说 back_end_name?
当我在第一个 WHERE 子句之后添加 GROUP BY 时,在封闭查询的末尾,它说 front_end_name 是无效的列名。
另外,我想按 indexstats.avg_fragmentation_in_percent 排序。显然,我不能在查询的最后执行此操作,因为 indexstats 在封闭的查询中是本地的。当我尝试在封闭查询的末尾执行此操作时,它告诉我“ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP、OFFSET 或 FOR XML 。”
关于如何将 GROUP BY front_end_name 和 ORDER BY indexstats.avg_fragmentation_in_percent 添加到现有查询的任何提示? SQL 还是很新的,所以我正在学习。我试图避免多次编写 case 语句。
谢谢!
【问题讨论】:
-
Edit 问题并通过发布相关的
CREATE TABLE语句向我们展示架构,该表的示例数据为INSERT INTO语句,预期结果为表格文本,不要忘记标记您正在使用的 DBMS 及其版本。
标签: sql group-by subquery sql-order-by case