将查询结果拆分为 n 个子集,但尊重列的一致性
Split results of query in n subsets but respect togetherness of columns
如果问题标题具有误导性,我深表歉意;如果编辑发现更好的措辞,请改进!
场景如下:我需要对我们 GIS 数据库中的大量数据进行透视。客户希望将这些数据分成他认为合适的均匀部分,并将这些数据放在不同的 Excel 工作表上。
要执行此透视,我首先将我需要的所有列放入一个名为 @column_list
的变量中,然后使用 ntile()
:
将它们平均拆分
SELECT @column_list = @column_list + srcTable.colName
FROM (
SELECT '[' + l.LONGNAME + ' (' + CONVERT(varchar(10), [SMPDATE], 104) + ')],' as colName
,NTILE(@Divider) over(order by l.LONGNAME, m.SMPDATE) as tile_nr
FROM [GEODIN_MES_WASTAB01] m
INNER JOIN GEODIN_LOC_ASBFILTR f
ON m.INVID = f.INVID
INNER JOIN GEODIN_LOC_SSGKRZT1 l
ON f.PRJ_ID = l.PRJ_ID AND
f.LOCID = l.LOCID
WHERE m.SMPDATE >= @Startdate AND m.SMPDATE <= @Enddate
) srcTable
WHERE srcTable.tile_nr = @Subset
现在这给了我一个列列表,看起来类似于:
[A1 (01.01.2011)] [A1 (10.01.2011)] ... [B16 (10.7.2012)] ... [X67 (11.12.2014)]
这里的问题是,我不能让数据在一组具有相同长名称的列之间拆分!因此,如果有 10 列带有 [A1 (date)]
,则不可能将 3 个项目放在图块 1 上,而其余 7 个项目放在图块 2 上:
TILE1 | TILE1 | TILE2
-------------------------------------------------------------
[A1 (01.01.2011)]| [A1 (10.01.2011)] [A3 (10.7.2012)]
这里是否有替代方案,其工作原理与 NTILE 大致相同,但要遵守所有 LONGNAMES 都需要在同一个磁贴上的标准?
最后我选择了这个:
SELECT @column_list = @column_list + srcTable.colName
FROM (
SELECT TOP 10000 '[' + l.LONGNAME + ' (' + CONVERT(varchar(10), [SMPDATE], 104) + ')],' as colName
FROM [GEODIN_MES_WASTAB01] m
INNER JOIN GEODIN_LOC_ASBFILTR f
ON m.INVID = f.INVID
INNER JOIN GEODIN_LOC_SSGKRZT1 l
ON f.PRJ_ID = l.PRJ_ID AND
f.LOCID = l.LOCID
WHERE m.SMPDATE >= @StartDate AND m.SMPDATE <= @Enddate
AND l.LONGNAME IN (
SELECT y.colName
FROM
(SELECT x.colName
,NTILE(@Divider) over(order by x.colName) as tile
FROM (
SELECT DISTINCT(l.LONGNAME) as colName
FROM [GEODIN_MES_WASTAB01] m
INNER JOIN GEODIN_LOC_ASBFILTR f
ON m.INVID = f.INVID
INNER JOIN GEODIN_LOC_SSGKRZT1 l
ON f.PRJ_ID = l.PRJ_ID AND
f.LOCID = l.LOCID
WHERE m.SMPDATE >= @Startdate AND m.SMPDATE <= @Enddate
)x
)y
WHERE y.tile = @Subset
)
Order by l.LONGNAME
) srcTable
它的作用是确定 Where IN (...)
子句中的所有兴趣点。这也是与 ntile 发生分裂的地方
如果问题标题具有误导性,我深表歉意;如果编辑发现更好的措辞,请改进!
场景如下:我需要对我们 GIS 数据库中的大量数据进行透视。客户希望将这些数据分成他认为合适的均匀部分,并将这些数据放在不同的 Excel 工作表上。
要执行此透视,我首先将我需要的所有列放入一个名为 @column_list
的变量中,然后使用 ntile()
:
SELECT @column_list = @column_list + srcTable.colName
FROM (
SELECT '[' + l.LONGNAME + ' (' + CONVERT(varchar(10), [SMPDATE], 104) + ')],' as colName
,NTILE(@Divider) over(order by l.LONGNAME, m.SMPDATE) as tile_nr
FROM [GEODIN_MES_WASTAB01] m
INNER JOIN GEODIN_LOC_ASBFILTR f
ON m.INVID = f.INVID
INNER JOIN GEODIN_LOC_SSGKRZT1 l
ON f.PRJ_ID = l.PRJ_ID AND
f.LOCID = l.LOCID
WHERE m.SMPDATE >= @Startdate AND m.SMPDATE <= @Enddate
) srcTable
WHERE srcTable.tile_nr = @Subset
现在这给了我一个列列表,看起来类似于:
[A1 (01.01.2011)] [A1 (10.01.2011)] ... [B16 (10.7.2012)] ... [X67 (11.12.2014)]
这里的问题是,我不能让数据在一组具有相同长名称的列之间拆分!因此,如果有 10 列带有 [A1 (date)]
,则不可能将 3 个项目放在图块 1 上,而其余 7 个项目放在图块 2 上:
TILE1 | TILE1 | TILE2
-------------------------------------------------------------
[A1 (01.01.2011)]| [A1 (10.01.2011)] [A3 (10.7.2012)]
这里是否有替代方案,其工作原理与 NTILE 大致相同,但要遵守所有 LONGNAMES 都需要在同一个磁贴上的标准?
最后我选择了这个:
SELECT @column_list = @column_list + srcTable.colName
FROM (
SELECT TOP 10000 '[' + l.LONGNAME + ' (' + CONVERT(varchar(10), [SMPDATE], 104) + ')],' as colName
FROM [GEODIN_MES_WASTAB01] m
INNER JOIN GEODIN_LOC_ASBFILTR f
ON m.INVID = f.INVID
INNER JOIN GEODIN_LOC_SSGKRZT1 l
ON f.PRJ_ID = l.PRJ_ID AND
f.LOCID = l.LOCID
WHERE m.SMPDATE >= @StartDate AND m.SMPDATE <= @Enddate
AND l.LONGNAME IN (
SELECT y.colName
FROM
(SELECT x.colName
,NTILE(@Divider) over(order by x.colName) as tile
FROM (
SELECT DISTINCT(l.LONGNAME) as colName
FROM [GEODIN_MES_WASTAB01] m
INNER JOIN GEODIN_LOC_ASBFILTR f
ON m.INVID = f.INVID
INNER JOIN GEODIN_LOC_SSGKRZT1 l
ON f.PRJ_ID = l.PRJ_ID AND
f.LOCID = l.LOCID
WHERE m.SMPDATE >= @Startdate AND m.SMPDATE <= @Enddate
)x
)y
WHERE y.tile = @Subset
)
Order by l.LONGNAME
) srcTable
它的作用是确定 Where IN (...)
子句中的所有兴趣点。这也是与 ntile 发生分裂的地方