多行的Concat单元格成一行

时间:2018-03-06 12:21:10

标签: sql sql-server view pivot sql-server-2012-express

我对SQL Server表有一个非常奇怪的要求,我不确定是否无法解决。

我有一个客户端网格/表,它通过给定的T-SQL查询/存储过程显示数据。我正在查看的SQL Server数据库中的表是带有时间戳的数字数据 - 如下所示:

| 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 |

现在的要求是在一行中显示更多' - ' - 列,如下所示:

| 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 |

注意:连续的第一个数字只是为了便于阅读)

现在我想创建一个视图/存储过程,它允许我提供我想要的多个列和数量的列。

我不知道如何处理这个问题。因为您必须查看下一行x并删除它们并将它们应用到第一行。

2 个答案:

答案 0 :(得分:1)

试试这个:

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

答案 1 :(得分:0)

我找到了一个尚未完全动态的答案,但它解决了基本要求。我稍后会发布完全动态的存储过程。

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;

如果我不需要外部选择会很好,但我没有找到解决方法。