2016-10-30 1 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

'My Required Output 'должен показать кассиру с 0 Waiting_Customer' ... если это будет степень логики, тогда что было бы неправильно с помощью' WHERE Waiting_Customer = 0'? Кстати, ваш первый запрос имеет несбалансированные круглые скобки и даже не будет работать. –

+0

@TimBiegeleisen, спасибо за упоминание. Я исправляю родительскую проблему. –

+0

@TimBiegeleisen, не могли бы вы дать мне точный запрос? –

ответ

0

Тезисы решения генерировать отчеты для поз от 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

Посмотреть мой отредактированный пост сейчас –