Sql server 2008 T-SQL帮助-类似Pivot的函数,用于合并某些数据

Sql server 2008 T-SQL帮助-类似Pivot的函数,用于合并某些数据,sql-server-2008,tsql,pivot,Sql Server 2008,Tsql,Pivot,我有一个T-SQL问题要问,通常SQL是我的强项,但出于某种原因,我在以下几点上被难住了。就这样 我有一张表格,格式如下: CREATE TABLE [tmp_LoadDataWithAutoID]( [DataID] int PRIMARY KEY IDENTITY(1,1), [SiteType] [varchar](800) NULL, [RegionId] [varchar](800) NULL, [RegionName] [varchar](800) N

我有一个T-SQL问题要问,通常SQL是我的强项,但出于某种原因,我在以下几点上被难住了。就这样

我有一张表格,格式如下:

CREATE TABLE [tmp_LoadDataWithAutoID](
    [DataID] int PRIMARY KEY IDENTITY(1,1),
    [SiteType] [varchar](800) NULL,
    [RegionId] [varchar](800) NULL,
    [RegionName] [varchar](800) NULL,
    [Site] [varchar](800) NULL,
    [SiteName] [varchar](800) NULL,
    [PluCode] [varchar](800) NULL,
    [Quantity] [varchar](800) NULL,
    [SalesValue] [varchar](800) NULL,
) ON [PRIMARY]
这是使用BCP从TXT Fule加载的

该文件的问题在于,并非每一行都给出了存储信息,而且每条记录都没有告诉我存储信息是什么,它只是自动地在上面包含信息的那一行中

1   F   2 OR    AUCKLAND 100021 KAITAIA 1   1   11.95   SHH LIMITED 2038    1688    732
2                       10  626.95  4620.16 
3                       2   71278.466   121049.29   NULL
4                       2807    12  -3.48   NULL
5                       29470000105 68  217.6
所以我所做的就是运行一个查询,它获取我用它的 数据标识

我有从1号到627号,628-1301号和1302-1858号的身份证

问题是,iIpivot如何将这个表重新连接到它自己,从而计算出每个存储的最小和最大数据ID是多少

***编辑****

为了使它更容易,我将描述一个较小的表子集

DataID  SiteSite    SiteName
1   100021  STORE KAITAIA
628 100062  STORE KAIKOHE
1301    100074  STORE PAIHIA
1859    101232  STORE OPOTIKI
2383    101250  STORE TE KUMI
3135    101359  STORE MIDWAY
4055    101381  STORE WAIROA
4988    101429  STORE TARADALE
5540    101448  STORE TAMATEA
6062    101460  STORE HAVELOCK NORTH
6556    101481  STORE KARAMU ROAD
6971    101500  STORE PARKVALE
7423    101605  STORE SEAVIEW ROAD
7812    101624  STORE MERRILANDS
8334    101646  STORE INGLEWOOD
我需要创建反转表的查询,如下所示:

SiteSite,  SiteName,           MinDataID, MaxDataID
100021     STORE KAITAIA       1           627
100062     STORE KAIKOHE       628         1300
100074     STORE PAIHIA        1301        1858 
一旦您有了每行的站点信息。您可以使用下面的查询来获取每个存储的最小和最大数据ID

第一部分包含行编号

第二部分将获得最小数据ID

在这里可以获得最小和最大数据ID

最后,删除临时表

终于解决了,, 谢谢你看了

答案是:

SELECT DISTINCT DMRA.SiteSite, DMRA.SiteName, MaxDataID = DMRA.DataID, MinDataID =( MIN(DMRB.DataID))
FROM #tmp_DataMarketRecords DMRA
LEFT JOIN #tmp_DataMarketRecords DMRB ON  DMRA.DataID < DMRB.DataID
GROUP BY DMRA.DataID, DMRA.SiteSite, DMRA.SiteName
ORDER BY MaxDataID

你的意思是你有第一家商店的信息,也就是说,从1-627。2-627中的行没有足够的数据来说明它们属于哪个存储?是的,如果上面的请求没有意义,请道歉。还有一件事,行中的哪个字段描述它属于存储1?我的意思是,正如您所说,数据ID为1-627的行属于Store 1,您如何了解它?我不太确定我是否了解,我认为这部分是因为您的数据样本看起来有点混乱。它们似乎包含了很多表格,这可能是原因。您可以通过删除一些不相关的列来稍微整理它们—您可以使用省略号来代替,并将其余的列与空格(而不是选项卡)对齐—效果更好。列SiteSite是一个描述实际SiteID的列,但我确实需要为表中每个不同的站点构建一个“收件人和发件人”表。很抱歉,我试图执行您的查询。它显示了错误的max id,并且在最后一条记录中为max id显示了null。它在max data id中显示了错误的数据,在max data id的最后一条记录中为null
Select ROW_NUMBER() Over(Order by dataId) as RowNo, * into #temp1 from [tmp_LoadDataWithAutoID]
Select Min(dataid) as [MinDataID]
into #temp2 From [tmp_LoadDataWithAutoID]
Group By Site 
Select t2.[MinDataID] MinDataID, 
(Case When 
    (Select DataID - 1 from #temp1 Where RowNo = t1.RowNo + 1) is Null Then t2.[MinDataID] 
Else 
    (Select DataID - 1 from #temp1 Where RowNo = t1.RowNo + 1) 
End) MaxDataID
From #temp1 t1
Inner Join #temp2 t2 on t1.DataID = t2.[MinDataID]
drop table #temp1
drop table #temp2
SELECT DISTINCT DMRA.SiteSite, DMRA.SiteName, MaxDataID = DMRA.DataID, MinDataID =( MIN(DMRB.DataID))
FROM #tmp_DataMarketRecords DMRA
LEFT JOIN #tmp_DataMarketRecords DMRB ON  DMRA.DataID < DMRB.DataID
GROUP BY DMRA.DataID, DMRA.SiteSite, DMRA.SiteName
ORDER BY MaxDataID