使用子查询时,结果重复,需要过滤掉Null,仅当value存在时才显示value

时间:2019-05-28 22:57:14

标签: sql-server-2012

(已编辑)使用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

结果具有重复的记录,因为“ User_Assigned”的SubSelect查询找到了一个空值和一个用户,因此有两个记录。我希望有一些逻辑可以检查是否分配了用户,它返回用户,否则返回null。我不知道该怎么做。谢谢您的帮助!!!

1 个答案:

答案 0 :(得分:0)

这似乎可以满足您的需求。

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