我有点奇怪的情况。我们的采购订单可以有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只有一行
答案 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;