我现在有一张表SaleData,它的数据如下(字段名为第一行):
SaleOrg SaleBar SaleDate
柜组A 柜101 2008-1-2
柜组A 柜101 2008-1-15
柜组A 柜102 2008-1-2
柜组A 柜102 2008-1-13
柜组B 柜201 2008-1-3
柜组B 柜201 2008-1-16
柜组B 柜202 2008-1-1
柜组B 柜202 2008-1-10
柜组B 柜202 2008-1-20我想通过一条查询语句,查询出如下结果:
SaleOrg SaleBar SaleDate NextSaledate KeepDay
柜组A 柜101 2008-1-2 2008-1-15 13
柜组A 柜101 2008-1-15 NULL 1
柜组A 柜102 2008-1-2 2008-1-13 11
柜组A 柜102 2008-1-13 NULL 1
柜组B 柜201 2008-1-3 2008-1-16 13
柜组B 柜201 2008-1-16 NULL 1
柜组B 柜202 2008-1-1 2008-1-10 9
柜组B 柜202 2008-1-10 2008-1-20 10
柜组B 柜202 2008-1-20 NULL 1查询说明:分析某个柜组(SaleOrg)下的柜台(SaleBar)持续为发生交易的天数(KeepDay)。那么,从第一行数据来看,KeepDay这个字段的数据公式就是该柜组(柜组A)下的柜台(柜101)的下次发生交易
的时间(2008-1-15)减去本次的日期(2008-1-2)得到(13)。最后一次发生交易的行记录,Keepday就直接是1。
同时要求不同的柜组和柜台单独计算。为此我的想法是增加一列,把同柜组的同柜台的下次交易日期提上来,最后一天则用NULL表示(如上面结果所示),
后面的Keepday用一个简单的公式计算就OK了。问题是这个查询语句我怎么也写不出来,想在此请教专家。当然,如果有更好的方法把Keepday计算出来就更好了。
偶笨,左思右想还是想不出好办法。
!!!很急,望赐教。  同时先谢谢各位给予帮助的专家了。PS:附上上面所示数据库的生成脚本,以供专家参考:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ZMFC_Test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ZMFC_Test]
GOCREATE TABLE [dbo].[ZMFC_Test] (
[SaleOrg] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[SaleBar] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[SaleDate] [datetime] NOT NULL 
) ON [PRIMARY]GO
Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组B','柜202','2008-1-1')
Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组A','柜101','2008-1-2')
Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组A','柜102','2008-1-2')
Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组B','柜201','2008-1-3')
Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组B','柜202','2008-1-10')
Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组A','柜102','2008-1-13')
Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组A','柜101','2008-1-15')
Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组B','柜201','2008-1-16')
Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组B','柜202','2008-1-20')
GO

解决方案 »

  1.   

    CREATE TABLE [dbo].[ZMFC_Test] ( 
    [SaleOrg] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL , 
    [SaleBar] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL , 
    [SaleDate] [datetime] NOT NULL 
    ) ON [PRIMARY] GO 
    Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组B','柜202','2008-1-1') 
    Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组A','柜101','2008-1-2') 
    Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组A','柜102','2008-1-2') 
    Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组B','柜201','2008-1-3') 
    Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组B','柜202','2008-1-10') 
    Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组A','柜102','2008-1-13') 
    Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组A','柜101','2008-1-15') 
    Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组B','柜201','2008-1-16') 
    Insert Into ZMFC_Test(SaleOrg,SaleBar,SaleDate) Values('柜组B','柜202','2008-1-20') 
    GO select 
    *,
    [KeepDay]=datediff(d,SaleDate,isnull([NextSaledate],SaleDate+1))
    from 
    (select 
    *,
    [NextSaledate]=(select min(SaleDate) from ZMFC_Test where [SaleOrg]=a.[SaleOrg] and [SaleBar]=a.[SaleBar] and [SaleDate]>a.[SaleDate])
    from ZMFC_Test a)Tmp
    order by [SaleOrg],[SaleBar]SaleOrg              SaleBar              SaleDate                NextSaledate            KeepDay
    -------------------- -------------------- ----------------------- ----------------------- -----------
    柜组A                  柜101                 2008-01-02 00:00:00.000 2008-01-15 00:00:00.000 13
    柜组A                  柜101                 2008-01-15 00:00:00.000 NULL                    1
    柜组A                  柜102                 2008-01-13 00:00:00.000 NULL                    1
    柜组A                  柜102                 2008-01-02 00:00:00.000 2008-01-13 00:00:00.000 11
    柜组B                  柜201                 2008-01-03 00:00:00.000 2008-01-16 00:00:00.000 13
    柜组B                  柜201                 2008-01-16 00:00:00.000 NULL                    1
    柜组B                  柜202                 2008-01-20 00:00:00.000 NULL                    1
    柜组B                  柜202                 2008-01-01 00:00:00.000 2008-01-10 00:00:00.000 9
    柜组B                  柜202                 2008-01-10 00:00:00.000 2008-01-20 00:00:00.000 10(9 行受影响)
      

  2.   

    select 
        *,
        [KeepDay]=datediff(d,SaleDate,isnull([NextSaledate],SaleDate+1))
    from 
    (select 
        *,
        [NextSaledate]=(select min(SaleDate) from ZMFC_Test where [SaleOrg]=a.[SaleOrg] and [SaleBar]=a.[SaleBar] and [SaleDate]>a.[SaleDate])
    from ZMFC_Test a)Tmp
    order by [SaleOrg],[SaleBar],SaleDate--加上一个日期排序
      

  3.   

    哇噻,查出来了,好强啊,看来自己还需要加强努力啊。
    PS:这个问题折腾我两天都没弄出来,您竟然就几行语句就搞定了,佩服啊!
    PSS:我上面的给的语句也符合SQL语法,为何我的语句没有按彩色标注??