我使用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
答案 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)