1

例如,如果我有下一张桌子:

| sensorid |date| value |
-------------------------
|    65000 | 00 |    32 |
|    65000 | 01 |    40 |
|    65000 | 02 |    35 |
|    65000 | 03 |    37 |
|    65000 | 04 |    39 |
|    65001 | 00 |    06 |
|    65001 | 01 |    10 |
|    65001 | 02 |    15 |
|    65001 | 03 |    26 |
|    65001 | 04 |    39 |

我想转换成这个表?

| SENSORID | 00 | 01 | 02 | 03 | 04 |
------------------------------------
| 65000    | 32 | 40 | 35 | 37 | 39 |
| 65001    | 6  | 10 | 15 | 26 | 39 | 

有什么特殊的方法还是我必须找到一种方法来迭代一段时间?

我需要帮助。

4

3 回答 3

2

可以做到,但您不会轻易获得动态查询。

正如对您问题的评论所暗示的那样,使用您实际执行 SQL 的编程语言可能更容易完成。

如果您事先知道所有“类别”(在您的情况下为日期列),则可以创建如下 SQL:

select
    sensorid,
    max(case when date = 0 then value else 0 end) as date0,
    max(case when date = 1 then value else 1 end) as date1,
    max(case when date = 2 then value else 2 end) as date2,
    max(case when date = 3 then value else 3 end) as date3,
    max(case when date = 4 then value else 4 end) as date4
from
    yourtable
group by
    sensorid

这是您可以试验的完整LINQPad脚本:

USE master
GO

IF EXISTS (SELECT * FROM sysdatabases WHERE name = 'SO16639641')
    DROP DATABASE SO16639641
GO

CREATE DATABASE SO16639641
GO

USE SO16639641
GO

CREATE TABLE original
(
    sensorid    int,
    date_       int,
    value       int
)
GO

INSERT INTO original
VALUES
    (65000, 00, 32),
    (65000, 01, 40),
    (65000, 02, 35),
    (65000, 03, 37),
    (65000, 04, 39),
    (65001, 00, 06),
    (65001, 01, 10),
    (65001, 02, 15),
    (65001, 03, 26),
    (65001, 04, 39)
GO

SELECT
    sensorid,
    MAX(CASE WHEN date_ = 0 THEN value ELSE 0 END) AS date0,
    MAX(CASE WHEN date_ = 1 THEN value ELSE 1 END) AS date1,
    MAX(CASE WHEN date_ = 2 THEN value ELSE 2 END) AS date2,
    MAX(CASE WHEN date_ = 3 THEN value ELSE 3 END) AS date3,
    MAX(CASE WHEN date_ = 4 THEN value ELSE 4 END) AS date4
FROM
    original
GROUP BY
    sensorid
GO

或者在这里下载。

我还添加了一个动态版本,它会根据数据确定要添加哪些日期列。涉及更多一点,但您可以在上面的链接中找到这两个脚本。

于 2013-05-19T21:57:19.997 回答
2

PIVOT 完全满足您的需求:

SELECT sensorid, 
       [00], [01], [02], [03], [04]
FROM MyTable
PIVOT
(
  MAX(value)
  FOR date IN ([00], [01], [02], [03], [04])
) AS PivotTable;

http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

于 2013-05-19T22:07:25.237 回答
0

看起来您想每天从每个传感器获取读数?您可以通过更改您的 select 语句来排序输出来非常愉快地做到这一点

从 [tablename] 中选择日期、sensorid、值按日期 asc、sensorid asc 排序;

日期传感器值
00 65000 32
00 65001 06
01 65000 40
01 65001 10

如果它确实需要水平格式化,我建议在 MSDN 上查看 PIVOT

于 2013-05-19T21:59:38.517 回答