0

I have a script when I'm trying to select locations in an inventory where quantity of said location is <= 5. The query is complete, now I'm trying to do some fine tuning, and what I'm running into now is when I use the distinct clause I am still receiving duplicate records in the same column. I do know the column next to the first are unique, but I thought distinguishing distinct and one column would roll over to next related to said column.

Here is my code:

select DISTINCT bin.scannable_id as bin, 
  bi.bin_id as case1,
  pallet.scannable_id as pallet,       
 -- bi.isbn as fcsku, 
  nvl(fs.asin,bi.isbn) as asin, 
  sum(bi.quantity) as quantity, 
  pallet.creation_date as received_date 
  from containers bin 
  join containers pallet on pallet.containing_container_id = bin.container_id 
  join containers case on case.containing_container_id = pallet.container_id 
  join bin_items bi on bi.container_id = case.container_id 
  left join fcskus fs on fs.fcsku = bi.isbn 
  where bin.scannable_id like 'R-1-T%'
  and bi.quantity <= '5'
  group by bin.scannable_id, pallet.scannable_id, bi.bin_id, bi.owner,bi.isbn,nvl(fs.asin,bi.isbn), pallet.creation_date
  order by sum(bi.quantity);

My output, which is obviously showing duplicate records in the scannable_id column: enter image description here

Correct Formatting Thanks to conrad.

    select DISTINCT bin.scannable_id as bin,   
  pallet.scannable_id as pallet,       
   nvl(fs.asin,bi.isbn) as asin, 
  sum(bi.quantity) as quantity   
  from containers bin 
  join containers pallet on pallet.containing_container_id = bin.container_id 
  join containers case on case.containing_container_id = pallet.container_id 
  join bin_items bi on bi.container_id = case.container_id 
  left join fcskus fs on fs.fcsku = bi.isbn 
  where bin.scannable_id like 'R-1-T%'
  having sum(bi.quantity) <= '5'
  group by bin.scannable_id, pallet.scannable_id, nvl(fs.asin,bi.isbn), bi.quantity
  order by sum(bi.quantity);
4

2 回答 2

1

如评论中所述,DISTINCT如果您有group by声明,则不需要。并格式化您的日期字段,因为根据您的 oracle 客户端配置,它不会向您显示整个日期格式(例如日期时间)。所以试试这个:

select  bin.scannable_id as bin, 
        bi.bin_id as case1,
        pallet.scannable_id as pallet,       
        nvl(fs.asin,bi.isbn) as asin, 
        to_char(pallet.creation_date, 'yyyy-mm-dd') as received_date 
        sum(bi.quantity) as quantity, 
  from containers bin 
     join containers pallet on pallet.containing_container_id = bin.container_id 
     join containers case on case.containing_container_id = pallet.container_id 
     join bin_items bi on bi.container_id = case.container_id 
     left join fcskus fs on fs.fcsku = bi.isbn 
 where bin.scannable_id like 'R-1-T%'
   and bi.quantity <= '5'
 group by bin.scannable_id, 
          pallet.scannable_id, 
          bi.bin_id, 
          bi.owner,
          bi.isbn,
          nvl(fs.asin,bi.isbn), 
          to_char(pallet.creation_date, 'yyyy-mm-dd')
 order by sum(bi.quantity);
于 2013-12-05T18:36:30.387 回答
0

bi.bin_id每行都不同,因此您的结果集中只有不同的结果。

  • distinct应用于最终的可见结果集(一旦to_char等函数被处理)
  • distinct如果您已经使用了group by表达式,则它是多余的

解决方案:bi.bin_id从您的选择表达式中跳过该列。

你的逻辑也很混乱。您想知道所有 bi.* 元素的总和。为此,您不能分组依据或表中的bi.bin_id任何字段bi。这就是您的quantity结果始终为 1 的原因。

于 2013-12-05T18:39:51.237 回答