2016-03-30 61 views
0

我有一個select語句,我正在嘗試報告。我有它拉動數據和我需要的所有東西,但我注意到,因爲我必須使用該組,因此它將丟棄表中不存在的行。我該如何制止這種情況或使其發揮作用。病例sql不起作用

SELECT Sum(CASE WHEN direction = 'I' THEN 1 ELSE 0 END) InBound, 
     Sum(CASE WHEN direction = 'O' THEN 1 ELSE 0 END) OutBound, 
     Sum(CASE WHEN direction = 'I' THEN p.duration ELSE 0 END) InBoundTime, 
     Sum(CASE WHEN direction = 'O' THEN p.duration ELSE 0 END) OutBoundTime, 
     u.fullname, 
     (CASE 
      WHEN EXISTS (SELECT g.goalamount 
         FROM [tblbrokergoals] AS g 
         WHERE (g.goaldate BETWEEN 
           '2016-03-21' AND '2016-03-27')) 
     THEN 
      g.goalamount 
      ELSE 0 
     END) AS GoalAmount 
FROM [tblphonelogs] AS p 
     LEFT JOIN [tblusers] AS u 
       ON u.fullname = p.phonename 
     LEFT OUTER JOIN [tblbrokergoals] AS g 
        ON u.fullname = g.brokername 
WHERE (calldatetime BETWEEN '2016-03-21' AND '2016-03-27') 
     AND (u.userid IS NOT NULL) 
     AND (u.direxclude <> '11') 
     AND u.termdate IS NULL 
     AND (g.goaldate BETWEEN '2016-03-21' AND '2016-03-27') 
GROUP BY u.fullname, 
      g.goalamount; 

這工作,並抓住當用戶在BrokerGoals但是,當用戶不在經紀人的目標,它只是刪除返回的結果集行中的所有數據。如何在brokergoals表中不存在將該值設置爲0或 - 因此該行不會被刪除時如何獲取它。

+0

問題是你需要一個附加的'LEFT JOIN'。我幾分鐘前剛剛回答幾乎完全相同的問題。讓我知道如果幫助http://stackoverflow.com/a/36317252/3470178 –

+0

我沒有權限在數據庫中創建一個新表。有時用戶在經紀人的目標有時他們不取決於他們是否在辦公室,但如果他們沒有在經紀人的目標價值,它仍然應該顯示0. –

回答

0
SELECT u.FullName, 
    SUM(CASE WHEN Direction = 'I' THEN 1 ELSE 0 END) AS InBound, 
    SUM(CASE WHEN Direction = 'O' THEN 1 ELSE 0 END) OutBound, 
    SUM(CASE WHEN Direction = 'I' THEN p.Duration ELSE 0 END) InBoundTime, 
    SUM(CASE WHEN Direction = 'O' THEN p.Duration ELSE 0 END) OutBoundTime, 
    CASE WHEN EXISTS (
     SELECT g.GoalAmount 
     FROM [Portal].[dbo].[tblBrokerGoals] AS g 
     WHERE g.GoalDate BETWEEN '2016-03-21' AND '2016-03-27' 
      AND u.FullName = g.BrokerName 
    ) THEN (
     SELECT g.GoalAmount 
     FROM [Portal].[dbo].[tblBrokerGoals] AS g 
     WHERE g.GoalDate BETWEEN '2016-03-21' AND '2016-03-27' 
      AND u.FullName = g.BrokerName 
    ) ELSE '0' END AS GoalAmount 
FROM [Portal].[dbo].[tblUsers] AS u 
LEFT JOIN [Portal].[dbo].[tblPhoneLogs] AS p 
    ON u.FullName = p.PhoneName 
WHERE u.UserID IS NOT NULL 
    AND u.DirExclude <> '11' 
    AND u.TermDate IS NULL 
    AND p.CallDateTime BETWEEN '2016-03-21' AND '2016-03-27' 
GROUP BY u.FullName 

這是我落得這樣做解決我的問題。我加的情況下已存在的語句,並在當時的聲明中所做的選擇否則爲0。

0

如果你有一個brokers表,那麼你可以使用你left join

SELECT b.broker_id, .... 
FROM brokers b 
LEFT JOIN .... ALL YOUR OTHER TABLES 
.... 
GROUP BY b.broker_id, .... 

如果你的經紀人有重名然後用

SELECT b.broker_id, .... 
FROM (SELECT DISTINCT broker_id 
     FROM brokers) b 
LEFT JOIN .... ALL YOUR OTHER TABLES 
.... 
GROUP BY b.broker_id, .... 
+0

這就是我改變了它,它仍然正在擺脫經紀人不存在於brokergoals表中的行由於 –

+0

我最終將它修復在select case語句中,我必須讓select語句也是這樣,否則其爲0工作。 –

+0

然後錯誤是在別的地方。正如我所說的另一個問題,刪除選擇上的聚合,只是使用與「GROUP BY」相同的值,您將看到行不存在 –

0

您是否嘗試過更換(CASE WHEN EXISTS(SELECT g.goalamount FROM [tblbrokergoals]爲G WHERE(G。 goaldate BETWEEN '2016年3月21日' 和 '2016年3月27日')) THEN g.goalamount ELSE 0 END)AS GoalAmount 只是g.goalamount,因爲你已經在該日期條件子句