2010-02-08 120 views
0

我遇到了下面提到的sql查询的问题。 基本上我试图列出所有在当前周和前一周每天捕获数据的系统用户。子查询没有引入EXISTS时,只能在选择列表中指定一个表达式。 Sql Server 2008

问题与我的查询下面我得到“只有一个表达式可以在选择列表中指定子查询未与EXISTS引入 ”。我已经改变了这个查询的一部分来使用EXISTS,但在子查询的最后一行仍然得到相同的错误。

DECLARE @Dates date; 
SET @Dates = '20091012'; 
DECLARE @FirstDayOfWeek date; 
DECLARE @lastDayOfWeek date; 

SET @FirstDayOfWeek = dbo.[fn_GetFirstDayOfWeek](@Dates); 
SET @lastDayOfWeek = DATEADD(day, 6,@FirstDayOfWeek); 

SET NOCOUNT ON 
SELECT DISTINCT q.CapturerId, u.Firstname, u.Lastname INTO #Users 
from Wop_Questionnaires q JOIN 
     Frwk_Users u 
    ON 
     q.CapturerId = u.Id JOIN 
    Core_Areas a ON 
    u.X_Wop_ProvinceId = a.Id 

WHERE u.X_Wop_ProvinceId = 5 



SELECT (SELECT #Users.Firstname+' '+#Users.Lastname, COUNT(q.CapturerId) 
    from Wop_Questionnaires q JOIN #Users on q.CapturerId = #Users.CapturerId 
    where EXISTS(SELECT #Users.CapturerID from #Users WHERE q.CapturerId = #Users.CapturerId) 
    AND q.CaptureDate >=DATEADD(DAY,DATEDIFF(DAY,'19000101',@FirstDayOfWeek),'19000101') 
    And q.CaptureDate < DATEADD(DAY,DATEDIFF(DAY,'19000101',@FirstDayOfWeek)+1,'19000101') 
    GROUP BY q.CapturerId, #Users.Firstname,#Users.Lastname) Sun, 
(SELECT #Users.Firstname+' '+#Users.Lastname, COUNT(q.CapturerId) 
    from Wop_Questionnaires q JOIN #Users on q.CapturerId = #Users.CapturerId 
    where EXISTS (SELECT #Users.CapturerID from #Users WHERE q.CapturerId = #Users.CapturerId) 
    AND q.CaptureDate >=DATEADD(DAY,DATEDIFF(DAY,'19000101',DATEADD(DAY,1,@FirstDayOfWeek)),'19000101') 
    AND q.CaptureDate < DATEADD(DAY,DATEDIFF(DAY,'19000101',DATEADD(DAY,1,@FirstDayOfWeek))+1,'19000101') 
    GROUP BY q.CapturerId, #Users.Firstname,#Users.Lastname) Mon, 
(SELECT #Users.Firstname+' '+#Users.Lastname, COUNT(q.CapturerId) 
    from Wop_Questionnaires q JOIN #Users on q.CapturerId = #Users.CapturerId 
    where EXISTS(SELECT #Users.CapturerID from #Users WHERE q.CapturerId = #Users.CapturerId) 
    AND q.CaptureDate >=DATEADD(DAY,DATEDIFF(DAY,'19000101',DATEADD(DAY,2,@FirstDayOfWeek)),'19000101') 
    AND q.CaptureDate < DATEADD(DAY,DATEDIFF(DAY,'19000101',DATEADD(DAY,2,@FirstDayOfWeek))+1,'19000101') 
    GROUP BY q.CapturerId, #Users.Firstname,#Users.Lastname) Tue; 


--;-- 

DROP TABLE #Users; 
SET NOCOUNT OFF 

感谢 Tebogo

回答

0

转换为以下?

SELECT... GROUP BY Sun 
UNION 
SELECT... GROUP BY Mon 
UNION 
SELECT ... GROUP BY Tue 

可能不是最有效的答案,但应该做的工作。

+0

感谢您的建议,但我实际上需要让用户每日总计在一行中。我需要计算某个地区的用户每日所做的每日Sun - Sat的条目,每个用户都列在一行中。 已经尝试了几个角度,但仍然挣扎 谢谢 – Tebogo 2010-02-08 15:51:16

+0

啊,抱歉误读您的查询 – Paolo 2010-02-08 17:06:32

0

修改了我的sql,看起来像下面这样:可能有更干净和有效的方法来做到这一点。我正在使用枢轴来达到预期的效果。

打扰长码。

DECLARE @Dates date; 
SET @Dates = '20091015'; 
DECLARE @FirstDayOfWeek date; 
DECLARE @lastDayOfWeek date; 

SET @FirstDayOfWeek = dbo.[fn_GetFirstDayOfWeek](@Dates); 
SET @lastDayOfWeek = DATEADD(day, 6,@FirstDayOfWeek); 

SET NOCOUNT ON 
SELECT q.CapturerId, u.Firstname+' '+u.Lastname Name INTO #Userss 
from Wop_Questionnaires q JOIN 
     Frwk_Users u 
    ON 
     q.CapturerId = u.Id JOIN 
    Core_Areas a ON 
    u.X_Wop_ProvinceId = a.Id 

WHERE u.X_Wop_ProvinceId = 5 
select #Userss.CapturerId from #Userss 
CREATE TABLE #Final(Name Varchar(50),cDay VARCHAR(50), NumRecs int); 

INSERT INTO #Final(Name, cDay, NumRecs) 
SELECT #Userss.Name,'Sun' as cDay, q.CapturerId NumRecs 
    from Wop_Questionnaires q JOIN #Userss on q.CapturerId = #Userss.CapturerId 
    where q.CapturerId IN(SELECT #Userss.CapturerID from #Userss) 
    AND q.CaptureDate >=DATEADD(DAY,DATEDIFF(DAY,'19000101',@FirstDayOfWeek),'19000101') 
    And q.CaptureDate < DATEADD(DAY,DATEDIFF(DAY,'19000101',@FirstDayOfWeek)+1,'19000101') 
    GROUP BY #Userss.Name, q.CapturerId 

    UNION ALL 

SELECT #Userss.Name,'Mon' as cDay, q.CapturerId NumRecs 
    from Wop_Questionnaires q JOIN #Userss on q.CapturerId = #Userss.CapturerId 
    where EXISTS (SELECT #Userss.CapturerID from #Userss WHERE q.CapturerId = #Userss.CapturerId) 
    AND q.CaptureDate >=DATEADD(DAY,DATEDIFF(DAY,'19000101',DATEADD(DAY,1,@FirstDayOfWeek)),'19000101') 
    AND q.CaptureDate < DATEADD(DAY,DATEDIFF(DAY,'19000101',DATEADD(DAY,1,@FirstDayOfWeek))+1,'19000101') 
    GROUP BY #Userss.Name, q.CapturerId 

    UNION ALL 

SELECT #Userss.Name,'Tue' cDay, q.CapturerId NumRecs 
    from Wop_Questionnaires q JOIN #Userss on q.CapturerId = #Userss.CapturerId 
    where EXISTS(SELECT #Userss.CapturerID from #Userss WHERE q.CapturerId = #Userss.CapturerId) 
    AND q.CaptureDate >=DATEADD(DAY,DATEDIFF(DAY,'19000101',DATEADD(DAY,2,@FirstDayOfWeek)),'19000101') 
    AND q.CaptureDate < DATEADD(DAY,DATEDIFF(DAY,'19000101',DATEADD(DAY,2,@FirstDayOfWeek))+1,'19000101') 
    GROUP BY #Userss.Name, q.CapturerId 

    UNION ALL 

SELECT #Userss.Name,'Wed' cDay, q.CapturerId NumRecs 
    from Wop_Questionnaires q JOIN #Userss on q.CapturerId = #Userss.CapturerId 
    where EXISTS(SELECT #Userss.CapturerID from #Userss WHERE q.CapturerId = #Userss.CapturerId) 
    AND q.CaptureDate >=DATEADD(DAY,DATEDIFF(DAY,'19000101',DATEADD(DAY,3,@FirstDayOfWeek)),'19000101') 
    AND q.CaptureDate < DATEADD(DAY,DATEDIFF(DAY,'19000101',DATEADD(DAY,3,@FirstDayOfWeek))+1,'19000101') 
    GROUP BY #Userss.Name, q.CapturerId 


    UNION ALL 

SELECT #Userss.Name,'Thur' cDay, q.CapturerId NumRecs 
    from Wop_Questionnaires q JOIN #Userss on q.CapturerId = #Userss.CapturerId 
    where EXISTS(SELECT #Userss.CapturerID from #Userss WHERE q.CapturerId = #Userss.CapturerId) 
    AND q.CaptureDate >=DATEADD(DAY,DATEDIFF(DAY,'19000101',DATEADD(DAY,4,@FirstDayOfWeek)),'19000101') 
    AND q.CaptureDate < DATEADD(DAY,DATEDIFF(DAY,'19000101',DATEADD(DAY,4,@FirstDayOfWeek))+1,'19000101') 
    GROUP BY #Userss.Name, q.CapturerId 


    UNION ALL 

SELECT #Userss.Name,'Fri' cDay, q.CapturerId NumRecs 
    from Wop_Questionnaires q JOIN #Userss on q.CapturerId = #Userss.CapturerId 
    where EXISTS(SELECT #Userss.CapturerID from #Userss WHERE q.CapturerId = #Userss.CapturerId) 
    AND q.CaptureDate >=DATEADD(DAY,DATEDIFF(DAY,'19000101',DATEADD(DAY,5,@FirstDayOfWeek)),'19000101') 
    AND q.CaptureDate < DATEADD(DAY,DATEDIFF(DAY,'19000101',DATEADD(DAY,5,@FirstDayOfWeek))+1,'19000101') 
    GROUP BY #Userss.Name, q.CapturerId 


    UNION ALL 

SELECT #Userss.Name,'Sat' cDay, q.CapturerId NumRecs 
    from Wop_Questionnaires q JOIN #Userss on q.CapturerId = #Userss.CapturerId 
    where EXISTS(SELECT #Userss.CapturerID from #Userss WHERE q.CapturerId = #Userss.CapturerId) 
    AND q.CaptureDate >=DATEADD(DAY,DATEDIFF(DAY,'19000101',DATEADD(DAY,6,@FirstDayOfWeek)),'19000101') 
    AND q.CaptureDate < DATEADD(DAY,DATEDIFF(DAY,'19000101',DATEADD(DAY,6,@FirstDayOfWeek))+1,'19000101') 
    GROUP BY #Userss.Name, q.CapturerId 

--SELECT * from #Final; 
--;--*/ 

SELECT Name, 
     [Sun] as [Sun], 
     [Mon] as [Mon], 
     [Tue] as [Tue], 
     [Wed] as [Wed], 
     [Thur] as [Thur], 
     [Fri] as [Fri], 
     [Sat] as [Sat], 
     [Sun]+[Mon]+[Tue]+[Wed]+[Thur]+[Fri]+[Sat] as Total 
FROM (SELECT Name, cDay, NumRecs FROM #Final) as Src 
PIVOT (Count(NumRecs) For cDay IN ([Sun],[Mon],[Tue],[Wed],[Thur],[Fri],[Sat])) as Pvt 
ORDER BY Name 

DROP TABLE #Userss; 
DROP TABLE #Final; 
SET NOCOUNT OFF 
相关问题