将多行的单元格连接成一行
Concat cells of multiple rows into one row
我对 SQL 服务器 table 有一个非常奇怪的要求,我不确定是否无法解决。
我有一个客户端 grid/table,它通过给定的 T-SQL query/stored 程序显示数据。我正在查看的 SQL 服务器数据库中的 table 是带有时间戳的数字数据 - 如下所示:
| DateTime(Key) | Value |
+------------------------+--------+
| 2010-07-27 17:00:00.00 | 1.337 |
| 2010-07-27 18:00:00.00 | 2.453 |
| 2010-07-27 19:00:00.00 | 3.2342 |
现在的要求是在一行中显示更多 'value' 列,如下所示:
| DateTime(Key) | Value | Value | Value |
+------------------------+--------+--------+--------+
| 2010-07-27 17:00:00.00 | 1.337 | 2.453 | 3.2342 |
| 2010-07-27 20:00:00.00 | 4.432 | 5.3422 | 6.9484 |
(注意:前面连续的数字只是为了便于阅读)
现在我想创建一个 view/stored 过程,它允许我提供我想要的列的倍数和数量。
我不知道如何处理这个问题。因为你必须查看接下来的 x 行并将它们删除并将它们应用于第一行。
试试这个:
DECLARE @Tab TABLE(DateTime DateTime, Value NUMERIC(8,5))
INSERT INTO @Tab VALUES('2010-07-27 17:00:00.00',1.337)
INSERT INTO @Tab VALUES('2010-07-27 18:00:00.00',2.453)
INSERT INTO @Tab VALUES('2010-07-27 19:00:00.00',3.2342)
INSERT INTO @Tab VALUES('2010-07-27 20:00:00.00',4.432)
INSERT INTO @Tab VALUES('2010-07-27 21:00:00.00',5.3422)
INSERT INTO @Tab VALUES('2010-07-27 22:00:00.00',6.9484)
SELECT MIN(D.DateTime)DateTime
,MIN(CASE WHEN D.RN=1 THEN D.Value END)Value1
,MIN(CASE WHEN D.RN=2 THEN D.Value END)Value2
,MIN(CASE WHEN D.RN=3 THEN D.Value END)Value3
FROM(
SELECT *
,(CAST(Value AS INT)-1)/3 Val
,ROW_NUMBER() OVER(PARTITION BY (CAST(Value AS INT)-1)/3 ORDER BY DateTime)RN
FROM @Tab
)D
GROUP BY val
结果:
DateTime Value1 Value2 Value3
2010-07-27 17:00:00.000 1.33700 2.45300 3.23420
2010-07-27 20:00:00.000 4.43200 5.34220 6.94840
我找到了一个还不是完全动态的答案,但它解决了基本要求。我稍后会 post 全动态存储过程。
DECLARE @Count int;
SET @Count = 3;
SELECT TimeUtc, V1, V2, V3 FROM (
SELECT
TimeUtc,
Value as V1,
LEAD(Value, 1, null) over (ORDER BY TimeUtc) AS V2,
LEAD(Value, 2, null) over (ORDER BY TimeUtc) AS V3,
(ROW_NUMBER() OVER (ORDER BY TimeUtc) - 1) % @Count AS RN
FROM MeasurementData
WHERE
) as tbl where RN = 0;
如果我不需要外层就好了select,但我没有找到解决办法。
我对 SQL 服务器 table 有一个非常奇怪的要求,我不确定是否无法解决。
我有一个客户端 grid/table,它通过给定的 T-SQL query/stored 程序显示数据。我正在查看的 SQL 服务器数据库中的 table 是带有时间戳的数字数据 - 如下所示:
| DateTime(Key) | Value |
+------------------------+--------+
| 2010-07-27 17:00:00.00 | 1.337 |
| 2010-07-27 18:00:00.00 | 2.453 |
| 2010-07-27 19:00:00.00 | 3.2342 |
现在的要求是在一行中显示更多 'value' 列,如下所示:
| DateTime(Key) | Value | Value | Value |
+------------------------+--------+--------+--------+
| 2010-07-27 17:00:00.00 | 1.337 | 2.453 | 3.2342 |
| 2010-07-27 20:00:00.00 | 4.432 | 5.3422 | 6.9484 |
(注意:前面连续的数字只是为了便于阅读)
现在我想创建一个 view/stored 过程,它允许我提供我想要的列的倍数和数量。
我不知道如何处理这个问题。因为你必须查看接下来的 x 行并将它们删除并将它们应用于第一行。
试试这个:
DECLARE @Tab TABLE(DateTime DateTime, Value NUMERIC(8,5))
INSERT INTO @Tab VALUES('2010-07-27 17:00:00.00',1.337)
INSERT INTO @Tab VALUES('2010-07-27 18:00:00.00',2.453)
INSERT INTO @Tab VALUES('2010-07-27 19:00:00.00',3.2342)
INSERT INTO @Tab VALUES('2010-07-27 20:00:00.00',4.432)
INSERT INTO @Tab VALUES('2010-07-27 21:00:00.00',5.3422)
INSERT INTO @Tab VALUES('2010-07-27 22:00:00.00',6.9484)
SELECT MIN(D.DateTime)DateTime
,MIN(CASE WHEN D.RN=1 THEN D.Value END)Value1
,MIN(CASE WHEN D.RN=2 THEN D.Value END)Value2
,MIN(CASE WHEN D.RN=3 THEN D.Value END)Value3
FROM(
SELECT *
,(CAST(Value AS INT)-1)/3 Val
,ROW_NUMBER() OVER(PARTITION BY (CAST(Value AS INT)-1)/3 ORDER BY DateTime)RN
FROM @Tab
)D
GROUP BY val
结果:
DateTime Value1 Value2 Value3
2010-07-27 17:00:00.000 1.33700 2.45300 3.23420
2010-07-27 20:00:00.000 4.43200 5.34220 6.94840
我找到了一个还不是完全动态的答案,但它解决了基本要求。我稍后会 post 全动态存储过程。
DECLARE @Count int;
SET @Count = 3;
SELECT TimeUtc, V1, V2, V3 FROM (
SELECT
TimeUtc,
Value as V1,
LEAD(Value, 1, null) over (ORDER BY TimeUtc) AS V2,
LEAD(Value, 2, null) over (ORDER BY TimeUtc) AS V3,
(ROW_NUMBER() OVER (ORDER BY TimeUtc) - 1) % @Count AS RN
FROM MeasurementData
WHERE
) as tbl where RN = 0;
如果我不需要外层就好了select,但我没有找到解决办法。