将查询结果拆分为 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 发生分裂的地方