使用sql server 2008在MSSQL中按周选择数据组

时间:2014-01-30 09:36:25

标签: sql

我使用sql server 2008的以下查询来按周选择数据组。

SET DATEFIRST 1;
SELECT  userid,
Sum(ISNULL(ljoin,0)) AS ljoin,
Sum(ISNULL(rjoin,0)) AS rjoin, DATEPART(wk, Date) AS WeekNumber,
CASE 
WHEN YEAR(DATEADD(DAY, 1-DATEPART(WEEKDAY, Min([date])), Min([date]))) < YEAR(Min([date]))
THEN
CAST(DATEADD(YEAR, DATEDIFF(YEAR, 0,DATEADD(YEAR, 0 ,GETDATE())), 0) AS Varchar(50))  
+ ' TO ' + Cast(DATEADD(dd, 7-(DATEPART(dw, Min([date]))), Min([date]))  AS Varchar(50))
ELSE
Cast(DATEADD(DAY, 1-DATEPART(WEEKDAY, Min([date])), Min([date])) AS Varchar(50)) 
+ ' TO ' +     Cast(DATEADD(dd, 7-(DATEPART(dw, Min([date]))), Min([date]))  AS Varchar(50))
END AS  DateRange
FROM Pairs_Details  where  userid='jitu'
Group By userid,DATEPART(wk, Date)

but it return following result 

userid  ljoin   rjoin   WeekNumber  DateRange

jitu    0   2   1   Jan  1 2014 12:00AM TO Jan  5 2014 12:00AM
jitu    1   1   2   Jan  6 2014 12:00AM TO Jan 12 2014 12:00AM
jitu    1   0   3   Jan 13 2014 12:00AM TO Jan 19 2014 12:00AM
jitu    2   0   5   Jan 27 2014 10:00PM TO Feb  2 2014 10:00PM

and whant query which return following result

userid  ljoin   rjoin   WeekNumber  DateRange                              pair

jitu    0   2   1   Jan  1 2014 12:00AM TO Jan  5 2014 12:00AM       0
jitu    1   1   2   Jan  6 2014 12:00AM TO Jan 12 2014 12:00AM       1
jitu    1   0   3   Jan 13 2014 12:00AM TO Jan 19 2014 12:00AM       0
jitu    2   0   5   Jan 27 2014 10:00PM TO Feb  2 2014 10:00PM       0

这可以使用以下查询及以上查询

来完成
Select Case When ljoin <= rjoin  Then ljoin Else rjoin End As pair from Pairs_Details 

但我不知道如何将这两个问题结合起来,请任何人告诉我们或建议我们,以便我们可以得到我想要的结果。我有以下表结构和数据。

  CREATE TABLE [dbo].[Pairs_Details](
  [sno] [int] IDENTITY(1,1) NOT NULL,
  [userid] [nvarchar](50) NULL,
  [date] [datetime] NULL,
  [ljoin] [int] NULL,
  [rjoin] [int] NULL
  ) ON [PRIMARY] 


  sno   userid              date                            ljoin rjoin
   1    jitu                2013-01-01 00:00:00.000         1   NULL
   2    jitu                2014-01-02 00:00:00.000           NULL    1
   3    tetu1234          2014-01-03 00:00:00.000           1   NULL
   4    jitu                2014-01-04 00:00:00.000             NULL    1
   5    saurbh123           2014-01-05 00:00:00.000     1   NULL
   6    jitu                2014-01-06 00:00:00.000         1   NULL
   9    saurbh123           2014-01-12 00:00:00.000         NULL    1
  10    jitu                2014-01-13 00:00:00.000         1   NULL
  11    rajeev123           2014-01-29 22:00:13.000         1   NULL
  12    saurbh123           2014-01-29 22:00:13.000         1   NULL
  13    jitu                2014-01-29 22:00:13.000         1   NULL
  14    rajeev123           2014-01-29 22:01:03.000         NULL    1
  15    saurbh123           2014-01-29 22:01:03.000         1   NULL
  16    jitu                2014-01-29 22:01:03.000         1   NULL
  7         tetu1234        2014-01-07 00:00:00.000         NULL    1
  8         jitu                2014-01-08 00:00:00.000         NULL    1

1 个答案:

答案 0 :(得分:1)

您的第二个查询需要使用聚合函数。 rjoin和ljoin引用原始列,而不是输出中的聚合列。试试这个:

SET DATEFIRST 1;
SELECT  userid,
Sum(ISNULL(ljoin,0)) AS ljoin,
Sum(ISNULL(rjoin,0)) AS rjoin, DATEPART(wk, Date) AS WeekNumber,
CASE 
WHEN YEAR(DATEADD(DAY, 1-DATEPART(WEEKDAY, Min([date])), Min([date]))) < YEAR(Min([date]))
THEN
CAST(DATEADD(YEAR, DATEDIFF(YEAR, 0,DATEADD(YEAR, 0 ,GETDATE())), 0) AS Varchar(50))  
+ ' TO ' + Cast(DATEADD(dd, 7-(DATEPART(dw, Min([date]))), Min([date]))  AS Varchar(50))
ELSE
Cast(DATEADD(DAY, 1-DATEPART(WEEKDAY, Min([date])), Min([date])) AS Varchar(50)) 
+ ' TO ' +     Cast(DATEADD(dd, 7-(DATEPART(dw, Min([date]))), Min([date]))  AS Varchar(50))
END AS  DateRange,
Case 
  When Sum(ISNULL(ljoin,0)) <= Sum(ISNULL(rjoin,0)) Then Sum(ISNULL(ljoin,0)) 
  Else Sum(ISNULL(rjoin,0)) 
End As pair
FROM Pairs_Details  where  userid='jitu'
Group By userid,DATEPART(wk, Date)