使用SQL Server查找PO记录在多行订单上有2个不同的发货日期

时间:2018-03-22 22:24:57

标签: sql sql-server count

我有点奇怪的情况。我们的采购订单可以有1行或更多行。如果采购订单有多行,则请求的发货日期应始终相同。问题是我们发现输入错误的情况,并且我们在不同的行上有不同的发货日期。我已经尝试使用COUNT,但它只计算每一行并返回1,如果两行相同,则返回2,因此我无法比较计数的总和。下面是带有错误结果的示例输出以及正确结果的查询(PO上的两个日期都相同)。有任何想法吗?

感谢。

查询:

SELECT PO_NUMBER,PO_ITEM_NUMBER,PO_REQ_SHIP_DATE FROM VW_PO_ITEM

WHERE PO_NUMBER IN ('0284141253', '0284503082')

GROUP BY PO_REQ_SHIP_DATE, 
         PO_NUMBER, 
         PO_ITEM_NUMBER

结果:

PO_NUMBER  PO_ITEM_NUMBER                          PO_REQ_SHIP_DATE
---------- --------------------------------------- -----------------------
0284141253 1                                       2018-02-28 00:00:00.000
0284141253 2                                       2018-03-20 00:00:00.000
0284503082 1                                       2018-03-31 00:00:00.000
0284503082 2                                       2018-03-31 00:00:00.000

(4 row(s) affected)

我想知道是否需要某种类型的分区?如果我COUNT PO_ITEM和REQ_SHIP_DATE列,我会得到以下内容:

PO_REQ_SHIP_DATE        PO_NUMBER  COUNT_ITEM  COUNT_SHIP_DATE
----------------------- ---------- ----------- ---------------
2018-02-28 00:00:00.000 0284141253 1           1
2018-03-20 00:00:00.000 0284141253 1           1
2018-03-31 00:00:00.000 0284503082 2           2

(3 row(s) affected)

似乎因为发货日期不同会出现问题,我的想法是说COUNT_SHIP_DATE = 1但我们确实有更多的PO只有一行

3 个答案:

答案 0 :(得分:1)

在我的设置中,我只使用了日期,而不是完整的时间戳。如果你的时间戳已经归零hh:mm:ss那么你应该没问题,否则你将不得不调整SQL:

select * from
(
select po_number, po_item_number, po_req_ship_date
    , row_number() over(partition by po_number, po_req_ship_date order by po_number, po_req_ship_date) as 'count_dates'
    , row_number() over(partition by po_number order by po_number) as 'count_items'
    , count(po_number) over(partition by po_number) as 'count_po_num'
from VW_PO_ITEM
)X
where count_po_num > 1
and count_dates > 1 ;

答案 1 :(得分:0)

我相信你想要这个:

SELECT PO_NUMBER, PO_ITEM_NUMBER
FROM VW_PO_ITEM
WHERE PO_NUMBER IN ('0284141253', '0284503082')
GROUP BY PO_NUMBER, PO_ITEM_NUMBER
HAVING MIN(PO_REQ_SHIP_DATE) <> MAX(PO_REQ_SHIP_DATE);

这将返回订单中具有不一致发货日期的项目。注意:这会忽略NULL个值。逻辑也可以适应它们。

答案 2 :(得分:0)

I found something that does the trick - finds any PO's that have more than one unique ship date and by default must be multi-line PO's - thanks for the help and ideas some stuff to use in the future (note I have joined to an employee table):

SELECT COUNT(DISTINCT I.PO_REQ_SHIP_DATE) AS '# OF REQ_SHIP_DATES', I.PO_NUMBER, E.TEAM_MEMBER_NAME [EMPLOYEE]

FROM   PDX_SAP_USER..VW_PO_ITEM I
JOIN   ADI_USER_MAINTAINED..SCM_PO_Employee_Name E
ON     I.PO_NUMBER = E.PO_NUMBER

WHERE DEL_INDICATOR <> 'L'
AND   PO_BALANCE_QUANTITY > 0
GROUP BY I.PO_NUMBER, E.TEAM_MEMBER_NAME

HAVING COUNT(DISTINCT I.PO_REQ_SHIP_DATE) > 1;