2014-01-24 175 views
1

我有兩個表registeratt_bottom,我只想顯示某個建築物的遲到時間,根據今天的日期顯示逗號分隔的學生。 這是加入兩個表時,將顯示數據的方式:連接行值sql server 2008 r2

Student ID | Building | Period | Grade 

    12345   2   1  11   
    12345   2   5  11 
    2   1  12 

我想這一點:

Student ID | <u>Building | Period | Grade 

12345   2   1,5  11 
    2   1  12 

這是我的查詢:

select r.STUDENT_ID, 
     r.BUILDING , 
     (select ab.attendancePeriod + ',' 
     from att_bottom ab 
     where ab.STUDENT_ID = r.student_id 
     and ab.building = '2' 
     and ab.attendance_c ='T' 
     and ab.SCHOOL_YEAR =2014 
     CONVERT(date,ab.attendance_date,102) = convert(date,getdate(),102) 
     FOR XML PATH ('')) AS PERIODS, 
     r.GRADE 
     FROM register r 
    where r.CURRENT_STATUS = 'A' 
    and r.BUILDING ='2' 

我讓所有的2號樓的學生,即使他們沒有T的attedance_c;對於週期NULL值被檢索:

Student ID | Building | Period | Grade 

12345   2  1 , 5 11 
    2  1 ,  12 
95687   2  NULL  09 
78417   2  NULL  10 
20357   2  NULL  11 

我試圖and ab.attendancePeriod is Not NULL和我仍然得到同樣的結果。

有什麼想法?

+0

什麼'DataType'您正在使用您的'期間'欄? – prograshid

+0

我得到三行與該查詢,而不是5(在我糾正語法錯誤後)。你能否仔細檢查你是如何得到這些結果的? (例如,95687,78417等來自哪裏 - 它們是否僅存在於註冊中,但不存在於att_bottom中?) –

+0

這些數字是我用來說明問題的隨機ID。 – user1308665

回答

0

外部查詢不偵聽子查詢中的任何過濾器;對於不符合連接條件的行,它將返回NULL。你需要過濾不同。這裏有一種方法(這也消除了錯誤的後面的逗號,並避免將它們轉換到貴比較字符串日期):

;WITH x AS 
(
    SELECT DISTINCT s = r.Student_ID, r.building, 
    p = ab.attendancePeriod, r.grade 
    FROM dbo.Register AS r 
    INNER JOIN dbo.att_bottom AS ab 
    ON r.Student_ID = ab.Student_ID 
    AND r.building = ab.building 
    WHERE ab.building = '2' 
    AND ab.attendance_c = 'T' 
    AND ab.SCHOOL_YEAR = 2014 
    AND ab.attendance_date >= CONVERT(DATE, GETDATE()) 
    AND ab.attendance_date < DATEADD(DAY, 1, CONVERT(DATE, GETDATE())) 
    AND r.building = '2' 
    AND r.CURRENT_STATUS = 'A' 
) 
SELECT DISTINCT 
    [Student ID] = x.s, 
    x.building, 
    Period = STUFF((SELECT ',' + x2.p FROM x AS x2 WHERE x2.s = x.s 
    FOR XML PATH(''), TYPE).value('.','nvarchar(max)'),1,1,''), 
    x.grade 
FROM x; 

另一種方式:

SELECT DISTINCT 
    r.Student_ID, 
    r.building, 
    Period = STUFF(b.p.value('.', 'nvarchar(max)'),1,1,''), 
    r.grade 
FROM dbo.Register AS r 
CROSS APPLY 
(
    SELECT p = ',' + ab.attendancePeriod 
    FROM dbo.att_bottom AS ab 
    WHERE ab.building = '2' 
    AND ab.attendance_c = 'T' 
    AND ab.SCHOOL_YEAR = 2014 
    AND ab.attendance_date >= CONVERT(DATE, GETDATE()) 
    AND ab.attendance_date < DATEADD(DAY, 1, CONVERT(DATE, GETDATE())) 
    AND ab.student_id = r.student_id 
    AND ab.building = r.building 
    FOR XML PATH(''),TYPE 
) AS b(p) 
WHERE b.p IS NOT NULL 
    AND r.building = '2' 
    AND r.CURRENT_STATUS = 'A'; 
+0

謝謝你,完美的工作! – user1308665

0

將AS PERIODS select選項作爲r的內部聯接。