Дублирование результатов при использовании подзапроса, необходимо отфильтровать пустые значения и показывать значение только при наличии значения - PullRequest
1 голос
/ 29 мая 2019

(Отредактировано) У меня проблема с дублированием результатов при использовании функции Count (), а затем при группировании по столбцу со значением NULL, имеющим значение.См. Ниже:

Вот пример таблицы данных:

t_order_table
  Line#     Order       User_Assigned
  1         12345       Null
  2         12345       Null
  3         12345       Null
  4         12345       Null
  5         12345       Null
  6         12345       Null
  7         12345       Null
  8         12345       Null
  9         12345       Null
  1         11223       Null
  2         11223       Null
  3         11223       Null

Вот скрипт для отчета по таблице (ниже):

Select Order,
(Select Count(Line#) from t_order_table ord
    Where User_Assigned is null
    and o.Order = ord.Order) as 'Open Lines',
(Select Count(Line#) from t_order_table ord
    Where User_Assigned is not null
    and o.Order = ord.Order) as 'Picked Lines',
(Select User_Assigned from t_order_table ord
    Where o.Order = ord.Order) as 'User Assigned'
from t_order_table o
Group By Order, User_Assigned

, который возвращает:

Order   Open Lines  Picked Lines    User_Assigned
12345       9           0               Null
11223       3           0               Null

Когда работник входит в систему, он получает назначение по линиям, один за другим, когда выбирает заказ.После того, как он выберет 3 строки, таблица будет выглядеть следующим образом:

t_order_table
  Line#     Order       User_Assigned
  1         12345       Chris
  2         12345       Chris
  3         12345       Chris
  4         12345       Null
  5         12345       Null
  6         12345       Null
  7         12345       Null
  8         12345       Null
  9         12345       Null
  1         11223       Null
  2         11223       Null
  3         11223       Null

, а отчет будет выглядеть следующим образом:

Order   Open Lines  Picked Lines    User_Assigned
12345       9           3               Null
12345       9           3               Chris
11223       3           0               Null

Результат имеет дублированную запись, поскольку запрос SubSelect дляUser_Assigned обнаружил пустое значение и пользователя, поэтому существует две записи.Я хотел бы, чтобы была какая-то логика, которая проверяет, назначен ли пользователь, возвращает ли он пользователя, иначе возвращает ноль.Я не могу понять, как это сделать.Спасибо за помощь !!!!

1 Ответ

0 голосов
/ 29 мая 2019

Это, кажется, дает вам то, что вам нужно.

set transaction isolation level read uncommitted;

declare @OrderTable as table
(
    [Line] tinyint,
    [Order] int,
    [User_Assigned] nvarchar(50)
);
insert into @OrderTable
(
    [Line],
    [Order],
    [User_Assigned]
)
values
(1, 12345, 'Chris'),
(2, 12345, 'Chris'),
(3, 12345, 'Chris'),
(4, 12345, null),
(5, 12345, null),
(6, 12345, null),
(7, 12345, null),
(8, 12345, null),
(9, 12345, null),
(1, 11223, null),
(2, 11223, null),
(3, 11223, null);

select 
    o.[Order],
    sum(iif(o.User_Assigned is null, 1, 0)) as [OpenLines],
    sum(iif(o.User_Assigned is not null, 1, 0)) as [PickedLines],
    max(o.User_Assigned) as [User_Assigned]
from @OrderTable as [o]
group by
    o.[Order]

Возвращает:

Order   OpenLines   PickedLines User_Assigned
11223   3           0           NULL
12345   6           3           Chris
...