2010-02-08 123 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 
相關問題