首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >返回逗号列表,如果在列表中找不到项,则返回NULL

返回逗号列表,如果在列表中找不到项,则返回NULL
EN

Stack Overflow用户
提问于 2016-04-21 18:52:43
回答 1查看 63关注 0票数 0

我正在WindowsNT6.3 (Build 9600:) (Hypervisor)上运行MicrosoftSQLServer2012-11.0.5058.0 (X64)标准版(64位)。我们正在以1Hz的速度将传感器数据输入到这个数据库。每个测试都有不同数量的传感器,可以是任何类型的。通道名称(ChName)将向用户描述他们是什么。

用户将从网络界面中选择TestID和他们想要的ChName

我有一个表,它是这样设置的,但是包含大约1500万行和大约50个TestID:

Timestamp datetimeTestID intChName varchar(100)Value real

代码语言:javascript
运行
复制
Timestamp | TestID | ChName | Value
13:52:12  | 1000   | A      | 23
13:52:12  | 1000   | B      | 2
13:52:12  | 1000   | C      | 150
13:52:13  | 1000   | A      | 25
13:52:13  | 1000   | C      | 147
13:52:13  | 1000   | B      | 1
13:52:14  | 1000   | A      | 24
13:52:14  | 1000   | B      | 4
13:52:14  | 1000   | C      | 151
13:52:15  | 1000   | B      | 8
13:52:15  | 1000   | C      | 153
13:52:16  | 1000   | B      | 3
13:52:16  | 1000   | C      | 149
13:52:17  | 1000   | C      | 152
13:52:17  | 1000   | A      | 27

我正在寻找一个查询,在搜索一个特定的TestID和特定的ChName时,它将返回一个逗号分隔的结果,并以NULL的顺序搜索未找到的结果。

例如,搜索TestID 1000和ChNames ('A','B','C')将返回:

代码语言:javascript
运行
复制
Timestamp  | Data
13:52:12   | 23,2,150
13:52:13   | 25,1,147
13:52:14   | 24,4,151
13:52:15   | NULL,8,153
13:52:16   | NULL,3,149
13:52:17   | 27,NULL,152

搜索TestID 1000和ChNames ('B','C')将返回:

代码语言:javascript
运行
复制
Timestamp  | Data
13:52:12   | 2,150
13:52:13   | 1,147
13:52:14   | 4,151
13:52:15   | 8,153
13:52:16   | 3,149
13:52:17   | NULL,152

我已经在PHP中实现了这一点,返回了包含TestIDChName的所有行,但速度很慢(返回503,000行,在PHP中进行分组大约需要2分钟)。我确实相信表的结构会更好,但不幸的是,我继承了这个设计,因此试图获得更高效的查询。

这些数据的目的是提取它并导出到excel,或者用户可以通过一个webapp来绘制它。用户有能力选择所有数据或某一时间段。

请求所有数据时的查询如下所示,然后在PHP中对其进行分组,如果未找到,则添加NULL。

代码语言:javascript
运行
复制
SELECT Timestamp,ChName,Value FROM data_table WHERE TestID=1000 AND ChName IN ('A','B',C') ORDER BY Timestamp,ChName
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-21 21:04:54

我建议使用PIVOT并根据您希望为ChName生成的结果的值列表动态构建查询:

代码语言:javascript
运行
复制
SELECT TimeStamp, 
       COALESCE([A], 'NULL') + ',' + 
       COALESCE([B], 'NULL') + ',' + 
       COALESCE([C], 'NULL') AS Data
FROM
    (   SELECT TimeStamp, ChName, Value 
        FROM   data_table
        WHERE  TestID = 1000
        AND    ChName IN ('A',B',C')
    ) AS SourceTable
PIVOT
    (
        Max(Value)
        FOR ChName IN ([A], [B], [C])
    ) AS PivotTable;

我还没有测试这个,所以它可能有一些语法问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36778139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档