[英]SQL JOIN: Return rows from LEFT and RIGHT table when there is a match
[英]In an SQL join operation, how to get the rows from the left join and only the aggregate of two columns from the right table
我試圖對tpos表中的數量求和,並為tpos中的每個項目計算不同的商店數量。
對於inv_dtl中的每一行,tpos表中可能有多行。 我想將一個腳本放在一起,該腳本將為我提供inv_dtl表中的所有行,並添加兩個符合聯接條件的聚合列sum(tpos.quantiy),count(distinct,tpos.store_number)。
這是我到目前為止所擁有的。 聚合正在工作,但是我的輸出包含tpos中匹配的數字或行。
例如inv_dtl中的1行在tpos中可能有100行。 我的輸出應該包含1行加上兩個聚合列,但是我當前的腳本會生成100行。
WITH FT1 As
(
SELECT * FROM inv_dtl WHERE inv_no IN (16084, 23456, 14789)
),
FT2 As
(
SELECT
FT1.*,
SUM(tpos.quantity) OVER (partition by tpos.item_id) As pos_qty,
DENSE_RANK() OVER (partition by tpos.store_number ORDER BY tpos.item_id ASC) +
DENSE_RANK() OVER (partition by tpos.store_number ORDER BY tpos.item_id DESC)
As unique_store_cnt
FROM FT1
LEFT JOIN tpos
ON tpos.item_id = FT1.ITEM_ID
And tpos.movement_date Between FT1.SDATE And FT1.EDATE
And tpos.store_number != 'CMPNY'
)
SELECT * FROM FT2 ORDER BY ITEM_ID
只需使用常規的GROUP BY,這將減少行數。 但是由於我不知道要從第一個提到的表中獲取哪些列,因此我僅以4個為例。
WITH
FT1 AS (
SELECT
col1, col2, col3, col4
FROM inv_dtl
WHERE inv_no IN (16084, 23456, 14789)
),
FT3 AS (
SELECT
FT1.col1, FT1.col2, FT1.col3, FT1.col4
, SUM(tpos.quantity) OVER (PARTITION BY tpos.item_id) AS pos_qty
, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ASC) +
AS unique_store_cnt
FROM FT1
LEFT JOIN tpos ON tpos.item_id = FT1.ITEM_ID
AND tpos.movement_date BETWEEN FT1.SDATE AND FT1.EDATE
AND tpos.store_number != 'CMPNY'
GROUP BY
FT1.col1, FT1.col2, FT1.col3, FT1.col4
)
SELECT
*
FROM FT3
ORDER BY col1, col2, col3, col4
請注意,如果數據屬於“相等等級”,則RANK()
和DENSE_RANK()
可以重復數字。 為了保證每行唯一的整數,請使用ROW_NUMBER()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.