2016-10-30 9 views
2

誰でもこのSQLクエリを修正するのを助けることができます。私は、オンラインキャッシャーがいるところにいる顧客の数を返しています。キャッシャーズにはWaiting_Customerがありませんので、結果には表示されません。私の必要とされるアウトプットは、以下のようにキャッシャーを0 Waiting_Customerで表示することです。このSQLクエリを修正する方法

POS Waiting_Customer 
    1  0 
    2  0 
    3  0 
    4  11 

下記のクエリを使用して次の結果が返されますが、

Select TOP 10 
    posId as 'POS', 
    count(number) As 'Waiting_Customer' 
From 
    Tickets 
Where 
    (PosId = 1 or PosId = 2 or PosId = 3 or PosId = 4) 
    and PosId between 1 and 12 
    and Status = 1 isTaken=1 
Group by 
    PosId 
Order by 
    Count(number) 

出力:

POS Waiting_Customer 
    4  11 

問合せ:

select distinct(cgroup) 
from Pos 
where status = 1 and id between 1 and 12 

出力:

cgroup 
    1 
    2 
    3 
    4 

問合せ:

select top 100 * 
from Tickets 
where Status = 1 
    and isTaken = 1 
    and PosId IN (1, 2, 3, 4) 
    and PosId BETWEEN 1 and 12 
order by 
    id desc 

出力:

Id PosId Status Number isTaken 
    7596 4  1  734  1 
    7594 1  1  732  1 
    7591 1  1  729  1 
    7588 3  1  726  1 
    7587 2  1  725  1 
+0

'私の必要な出力は、0のWaiting_Customerでキャッシャーを表示することです.' ...これがロジックの範囲であれば、単に' WHERE Waiting_Customer = 0'を使用すると何が問題になるでしょうか?あなたの最初のクエリーに不均衡なカッコがあり、実行されません。 –

+0

@TimBiegeleisen、言及いただきありがとうございます。私は親身な問題を修正しました。 –

+0

@TimBiegeleisen、正確なクエリを教えていただけますか? –

答えて

0

論文のソリューションは、あなたのテーブルが空であるので、場合でも、POS 1〜4のレコードを生成し、 4行は

with r (n) as (select 1 union all select n+1 from r where n<4) 

select  r.n        as pos 
      ,coalesce (Waiting_Customer,0) as Waiting_Customer 

from     r 

      left join (select  posId  
            ,count(number) as Waiting_Customer 

         From  Tickets 

         Where  PosId between 1 and 4 
           and Status=1 
           and isTaken=1 

         Group by PosId 
         ) t 

      on   t.posId = r.n 

Order by Waiting_Customer 
; 

オプション2

が返されます
select  r.n        as pos 
      ,coalesce (Waiting_Customer,0) as Waiting_Customer 

from     (values (1),(2),(3),(4)) r(n) 

      left join (select  posId  
            ,count(number) as Waiting_Customer 

         From  Tickets 

         Where  PosId between 1 and 4 
           and Status=1 
           and isTaken=1 

         Group by PosId 
         ) t 

      on   t.posId = r.n 

Order by Waiting_Customer 
; 
3

WHERE句からロジックを含む使用条件付き集約:

SELECT PosId as 'POS', 
     SUM(CASE WHEN PosId BETWEEN 1 AND 12 AND Status = 1 AND isTaken = 1 
       THEN 1 ELSE 0 END) AS Waiting_Customer 
FROM Tickets 
GROUP BY PosId 
ORDER BY Waiting_Customer 
+0

@Time Biegeleisen、それは何も返されません...ほぼ18のWaiting_Customerがあります。 –

+0

あなたの元のデータセットを希望する出力と共に表示します。 –

+0

私の編集した記事を参照してください –

関連する問題