我会使用UNPIVOT
,然后削减列名Val_0130
添加到datetime以获得所需的结果。这样你只需要在一个地方写出48列。
这里是一些测试数据:
DECLARE @Table AS TABLE (UID INT, Serial INT, Date DATETIME, Val_0030 MONEY, Val_0100 MONEY, Val_0130 MONEY, Val_0000 MONEY)
INSERT INTO @Table (UID, Serial, Date, Val_0030, Val_0100, Val_0130, Val_0000)
VALUES
(123, 123456, '2016-01-02',56.2,23.25,12.34,86.23)
,(231, 234561, '2016-01-05',26.2,13.25,23.45,106.23)
,(312, 345612, '2016-01-07',76.2,3.25,34.56,1010.56)
和查询
SELECT
UID
,Serial
,DateWithTime = [Date] + CAST((SUBSTRING(ColumnNames,5,2) + ':' + RIGHT(ColumnNames,2)) AS DATETIME)
,Value
FROM
@Table t
UNPIVOT (
Value
FOR ColumnNames IN (Val_0030, VAL_0100, Val_0130, VAL_0000)
) u
如果你不想打字了所有48列,就像我不想,只是运行此查询并将结果复制并复制到上述查询的ColumnNames IN()
部分。
DECLARE @ColString VARCHAR(MAX) = ''
DECLARE @DT DATETIME = '00:00'
WHILE @DT < '1900-01-02 00:00:00.000'
BEGIN
IF LEN(@ColString) > 0
BEGIN
SET @ColString += ','
END
SET @ColString += 'Val_' + FORMAT(@DT,'HHmm')
SET @DT = DATEADD(MINUTE,30,@DT)
END
SELECT @ColString
您是否生成UID和串行?如果是这样,为什么你不能按照你需要的时间间隔对你的日期字段进行分组并生成它们?但是,如果UID和系列存在,他们的名字让我认为他们是独特的......你如何处理为30分钟分组选择独特的? – Kosch
客户提供UID和序列号以识别设备。 UID是一个将设备定位在资产注册中的号码,序列号就是序列号。我会尝试分组,看看会发生什么。 –
您需要处理每个时间间隔组的多个UID和序列组,然后 – Kosch