TSQL根据不同的列为数据的每一行返回多列

时间:2018-08-03 17:03:13

标签: sql sql-server tsql grafana

我有一个[MemoryValue],[ServerName],[ServerType],[CreateDate]的桌子。 我想在Grafana中显示ServerName和ServerType的每个组合的MemoryValue。基本上,每个ServerName和ServerType组合都有不同的图。例如

MemoryValue ServerName  ServerType
15757746    bob         type1   
182         bob         type2   
8           bob         type3
15757746    bob2        type1   
182         bob2        type2   
8           bob2        type3

我希望每个ServerName + ServerType都有6个图形,其中显示MemoryValue。

当我尝试

select MemoryValue ,  CreateDate  as time
    from table
    group by ServerName, ServerType

它的错误是“在选择列表中无效,因为它既不在聚合函数中也不在GROUP BY子句中。”当我尝试将MemoryValue添加到GROUP BY时,该图无法反映我想要的内容,并且它显示单个图与多个图相反。

我希望每个CreateDate的MemoryValue(由每个ServerName和ServerType分隔)看起来像这样 Sample graph

2 个答案:

答案 0 :(得分:0)

您想要类似的东西

select MAX(MemoryValue) as mem ,  MAX(CreateDate)  as time
    from table
    group by ServerName, ServerType

将MAX更改为所需的任何聚合(AVG,SUM等)

答案 1 :(得分:0)

您正在寻找的是这种东西吗? SQL Server 2017中引入了STRING_AGG。

CREATE TABLE #Tmp (
    MemoryValue INT,
    ServerName VARCHAR(100),
    ServerType VARCHAR(100)
)
GO
INSERT INTO #Tmp (MemoryValue,ServerName,ServerType)
VALUES (15757746,'bob','type1'),(182,'bob','type2'),(8,'bob','type3'),(15757746,'bob2','type1'),(182,'bob2','type2'),(8,'bob2','type3')
GO

SELECT ServerType, string_agg(ServerName,','), MAX(MemoryValue)
FROM #Tmp
GROUP BY ServerType
GO