求各位解答!!求好方法!!
如题所述INPUT表A和INPUT表B连结,但INPUT表B的「商品编号」这个字段会出现重复数据,
当INPUT表B的「商品编号」这个字段重复时,希望根据INPUT表B的「类别编号」这个字段来优先抽出数据为'02'那一条,并且保留'02'那条数据的其他字段,并且保证INPUT表B的「类别编号」中编号不同的其他条记录会被正常抽出。
※注释
INPUT表B没有主键
■表信息
INPUT表A:书店(BOOK_STORE)
| 图书编号 | 书名 | 库存 | 在库类别 |
| BOOK_NUMBER | TITLE | INVENTORY | CATEGORY |
| 300201 | 大老虎 | 100 | 在库 |
| 300205 | Gutar | 100 | 在库 |
INPUT表B:销售记录(SALES_RECORD)
| 商品编号 | 书名 | 类别编号 | 售价 | 售出数量 |
| COMMODITY_NUMBER | BOOK_NAME | CATEGORY_NUMBER | SELLING_PRICE | QUANTITY_SOLD |
| 300201 | 大老虎 | 02 | 15.00 | 20 |
| 300201 | 海贼王 | 03 | 20.00 | 40 |
| 300205 | Gutar | 03 | 30.00 | 10 |
INSERT INTO SETTLEMENT ( COMMODITY_NUMBER,BOOK_NAME,CLASSIFICATION,CATEGORY,INVENTORY,QUANTITY_SOLD,REMAINING_QUANTITY,SELLING_PRICE
)
SELECT
T1.BOOK_NUMBER,
T1.TITLE,
T1.CATEGORY,
T2.CATEGORY_NUMBER,
T1.INVENTORY,
T2.QUANTITY_SOLD,
T1.INVENTORY - T2.QUANTITY_SOLD,
T2.SELLING_PRICE
FROM
BOOK_STORE T1,
SALES_RECORD T2
WHERE
T1.CATEGORY = '在库'
AND T1.BOOK_NUMBER = T2.COMMODITY_NUMBER (+);
■目前执行结果
OUTPUT表C:结算(SETTLEMENT)
| 商品编号 | 书名 | 在库类别 | 类别编号 | 库存 | 售出数量 | 剩余数量 | 表头 |
| COMMODITY_NUMBER | BOOK_NAME | CLASSIFICATION | CATEGORY | INVENTORY | QUANTITY_SOLD | REMAINING_QUANTITY | SELLING_PRICE |
| 300201 | 大老虎 | 在库 | 02 | 100 | 20 | 80 | 15 |
| 300201 | 大老虎 | 在库 | 03 | 100 | 40 | 60 | 20 |
| 300205 | Gutar | 在库 | 03 | 100 | 10 | 90 | 30 |
用下面这个子查询,替换你的T2表即可
SELECT b.*
from (
SELECT
T2.COMMODITY_NUMBER,
count(DISTINCT T2.CATEGORY_NUMBER) as num
FROM SALES_RECORD T2
GROUP BY T1.COMMODITY_NUMBER
) a
LEFT JOIN SALES_RECORD b
on a.COMMODITY_NUMBER = b.COMMODITY_NUMBER
AND (a.num = 1 or b.CATEGORY_NUMBER like '%02%')
INPUT表B中有没有唯一字段。
可以通过查询表B的某个唯一字段,然后将查询的结果作为上述sql的条件。
如:存在唯一字段id
select min(id) id from SALES_RECORD group by COMMODITY_NUMBER
SELECT
T1.BOOK_NUMBER,
T1.TITLE,
T1.CATEGORY,
T2.CATEGORY_NUMBER,
T1.INVENTORY,
T2.QUANTITY_SOLD,
T1.INVENTORY - T2.QUANTITY_SOLD,
T2.SELLING_PRICE
FROM
BOOK_STORE T1,
SALES_RECORD T2
WHERE
T1.CATEGORY = '在库'
AND T1.BOOK_NUMBER = T2.COMMODITY_NUMBER
and T2.id in(
select min(id) id from SALES_RECORD group by COMMODITY_NUMBER
)
使用开窗函数可以实现你的需求。
使用ROW_NUNBER OVER(partition by COMMODITY_NUMBER order by CATEGORY_NUMBER desc) RK将其作为SALES_RECORD 查询结果的一列
| 300201 | 大老虎 | 02 | 15.00 | 20 | RK=1
| 300201 | 海贼王 | 03 | 20.00 | 40 | RK=2
| 300205 | Gutar | 03 | 30.00 | 10 | RK=1
然后最后通过COMMODITY_NUMBER 字段关联 并且只取RK=1的数据