我有一个表格,其中有一列显示1到7重复的数字。
EDRImportID FileID value colnum rn
2 752454 PN 1 1
2 752454 NNN 2 2
2 752454 NNNN 3 3
2 752454 01/01/2019 00:00 4 4
2 752454 0 5 5
2 752454 01/01/2019 00:30 6 6
2 752454 0 7 7
2 752454 NNN 1 8
2 752454 NNNN 2 9
2 752454 SHOS-1 3 10
2 752454 01/01/2019 00:30 4 11
2 752454 0 5 12
2 752454 01/01/2019 01:00 6 13
2 752454 0 7 14
2 752454 NNN 1 15
2 752454 NNNN 2 16
所以我想将第1行第7行分配给GroupNumber 1,将第8行到第14行分配给GroupNumber 2,依此类推。
该表来自表中包含的csv字符串,并将始终具有7行。这是生成表的SQL。
SELECT
I.EDRImportID,
FileID,
value,
ROW_NUMBER() OVER(PARTITION BY Record,FileID ORDER BY (SELECT NULL)) as colnum,
ROW_NUMBER() OVER(PARTITION BY FileID ORDER BY (SELECT NULL)) as rn
FROM Base.Genesis_ImportFile I
CROSS APPLY STRING_SPLIT(Record, ',') AS Cols
WHERE I.FileType = 'PN'
AND I.Record like 'PN%'
AND I.EDRImportID = 2
AND FileID = 752454
一旦有了组号,我需要将每个组的7行透视为7列。我尝试了下面的代码,但是它使用了MAX
聚合,它将仅返回7列的一行,而不是几行
WITH PNColumns AS
(
SELECT
I.EDRImportID,
FileID,
value,
ROW_NUMBER() OVER(PARTITION BY Record,FileID ORDER BY (SELECT NULL)) as rn
FROM Base.Genesis_ImportFile I
CROSS APPLY STRING_SPLIT(Record, ',') AS Cols
WHERE I.FileType = 'PN'
AND I.Record like 'PN%'
AND I.EDRImportID = 2
AND FileID = 752454
)
SELECT
EDRImportID,
FileID,
[2] AS Station,
[3] AS Unit,
[4] AS FromDate,
[5] AS FromMW,
[6] AS ToDate,
[7] AS ToMW
FROM PNColumns
PIVOT(
MAX(value)
FOR rn IN ([2],[3],[4],[5],[6],[7])
) as PVT
答案 0 :(得分:1)
您应将ROW_NUMBER()
与CEILING
一起使用
CEILING(CAST(ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) AS DECIMAL)/7) AS Group
查询将类似于
SELECT
I.EDRImportID,
FileID,
value,
ROW_NUMBER() OVER(PARTITION BY Record,FileID ORDER BY (SELECT NULL)) as colnum,
CEILING(CAST(ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) AS DECIMAL)/7) AS Group
FROM Base.Genesis_ImportFile I
CROSS APPLY STRING_SPLIT(Record, ',') AS Cols
WHERE I.FileType = 'PN'
AND I.Record like 'PN%'
AND I.EDRImportID = 2
AND FileID = 752454
输出将
EDRImportID FileID value colnum rn
2 752454 PN 1 1
2 752454 NNN 2 1
2 752454 NNNN 3 1
2 752454 01/01/2019 00:00 4 1
2 752454 0 5 1
2 752454 01/01/2019 00:30 6 1
2 752454 0 7 1
2 752454 NNN 1 2
2 752454 NNNN 2 2
2 752454 SHOS-1 3 2
2 752454 01/01/2019 00:30 4 2
2 752454 0 5 2
2 752454 01/01/2019 01:00 6 2
2 752454 0 7 2
2 752454 NNN 1 3
2 752454 NNNN 2 3