2017-08-30 32 views
0

我需要一些幫助來查詢。我有一個具有以下信息的表格:SQL Server 2012:如何在條件成1列時加入2個案例?

enter image description here

我需要分配一個點系統,每一個電話,通話不到1分鐘,1至5分鐘之間的通話,來電5至10分鐘,最後調用了10分鐘

目前我的查詢是這樣的:

Select distinct convert (date,AIV.PSEndTime,102) as TRXDATE 
,AIV.Username 
,AIV.FirstName+' '+AIV.LastName as Agent_Name 
,AIV.ITypeDisplayValue 
,convert (datetime,AIV.PSBeginTime,120) as PSBeginTime 
,convert (datetime,AIV.PSEndTime,120) as PSEndTime 
,convert(CHAR(8),DATEADD(second,AIV.Talking,0),108) as [Talking] 
,CASE WHEN AIV.Talking <='60' THEN 1 ELSE 0 end as Less_than_1min 
,CASE WHEN AIV.Talking between '61' and '300' THEN 1 ELSE 0 end as Between_1_and_5_min 
,CASE WHEN AIV.Talking between '301' and '600' THEN 1 ELSE 0 end as Between_5_and_10_min 
,CASE WHEN AIV.Talking >='601' THEN 1 ELSE 0 END as More_than_10min 

From AgentInteractionsView as AIV WITH (NOLOCK) 

WHere UserName in ('TomE','MicDe','JulCa') 
and AIV.PSBeginTime > '2017-08-01' 
and AIV.PSEndTime < '2017-09-01' 
group by 
convert (date,AIV.PSEndTime,102) 
    ,AIV.Username 
,AIV.FirstName+' '+AIV.LastName 
,AIV.ITypeDisplayValue,AIV.DIDisplayValue 
,convert (datetime,(DATEADD(hour,2,AIV.PSBeginTime)),120) 
,convert (datetime,(DATEADD(hour,2,AIV.PSEndTime)),120) 
,convert(CHAR(8),DATEADD(second,AIV.Talking,0),108) 
,AIV.Talking 

而且然而這實際工作我注意到,當柱「會說話」,所以我增加了一個新的是空它不會給我一個結果查詢:

,CASE WHEN AIV.Talking <='60' THEN 1 ELSE 0 end as Less_than_1min 
,CASE WHEN AIV.Talking = null THEN 1 ELSE 0 end as Less_than_1min 

希望這些會導致單個列,但當然它給了我2列具有相同的標題。

我想這兩個查詢連接成1列,例如

,CASE WHEN AIV.Talking = null THEN 1 
ELSE (CASE WHEN AIV.Talking <='60' THEN 1 ELSE 0) end 
as Less_than_1min 

我思念的東西(顯然)還是我從SQL :)期待太多

+0

你並不需要使用CASE來處理NULL值,有ISNULL和COALESCE。 - COALESCE(AIV.Talking,0)如果它是NULL將返回0而不是NULL,並不會打破你的邏輯,因爲它會少於60. – Leonidas199x

+0

感謝我多麼希望Null單元顯示爲1在'Less_than_1min'colunm – Flaniganga

+0

如果您正確配置它以返回所需內容,以便在您的案例表達式中進行比較,那麼這就是以上所述。 0 <= 60,所以會返回一個1.已經回答了,所以我可以給出更多的細節。 – Leonidas199x

回答

0

感謝您的幫助,我能弄清楚我做錯了什麼。

隨着時間的和整數顯示秒數我來到這個解決方案:)

Select CASE WHEN AIV.Talking <='60' THEN 1 ELSE 0 end as Less_than_1min 
,CASE WHEN AIV.Talking between '61' and '300' THEN 1 ELSE 0 end as Between_1_and_5_min , 
CASE WHEN AIV.Talking between '301' and '600' THEN 1 ELSE 0 end as Between_5_and_10_min 
,CASE WHEN AIV.Talking >='601' THEN 1 ELSE 0 END as More_than_10min 

我真的希望這可以幫助其他人在未來:)

0

正如我提到我評論,則可以使用ISNULL或聚結以處理一個NULL值,例如碼:

DECLARE @time TIME; 
SET  @time = NULL; 

SELECT CASE WHEN COALESCE(@time,'00:00:01') <= '00:01:00' THEN 1 ELSE 0 END AS Test_Time; 

上面的代碼返回1,一樣:

DECLARE @time TIME; 
SET  @time = '00:00:01'; 

SELECT CASE WHEN COALESCE(@time,'00:00:01') <= '00:01:00' THEN 1 ELSE 0 END AS Test_Time; 

及以下的返回一個0:

DECLARE @time TIME; 
SET  @time = '00:02:01'; 

SELECT CASE WHEN COALESCE(@time,'00:00:01') <= '00:01:00' THEN 1 ELSE 0 END AS Test_Time; 

一樣:

DECLARE @time TIME; 
SET  @time = NULL; 

SELECT CASE WHEN @time <= '00:01:00' THEN 1 ELSE 0 END AS Test_Time; 

由於值爲NULL,它無法評估,所以返回false。

所以當使用COALESCE時,我只是確保我設置的值是NULL,如果它符合CASE表達式邏輯,則返回我需要的值。