在SQL联接操作中,如何从左联接中获取行,并仅从右表中获取两列的聚合

在SQL联接操作中,如何从左联接中获取行,并仅从右表中获取两列的聚合,sql,join,aggregate,window-functions,Sql,Join,Aggregate,Window Functions,我试图对tpos表中的数量求和,并计算tpos中每个项目的不同存储数量 对于inv_dtl中的每一行,tpos表中可能有多行。我想将一个脚本放在一起,它将为我提供inv_dtl表中的所有行,并添加两个与联接条件匹配的聚合列sum(tpos.quantiy)、count(distinct、tpos.store_number) 这是我到目前为止所拥有的。聚合正在工作,但我的输出包含TPO中匹配的行数 例如,inv_dtl中的一行在TPO中可能有100行。我的输出应该包含1行加上两个聚合列,但我当前的

我试图对tpos表中的数量求和,并计算tpos中每个项目的不同存储数量

对于inv_dtl中的每一行,tpos表中可能有多行。我想将一个脚本放在一起,它将为我提供inv_dtl表中的所有行,并添加两个与联接条件匹配的聚合列sum(tpos.quantiy)、count(distinct、tpos.store_number)

这是我到目前为止所拥有的。聚合正在工作,但我的输出包含TPO中匹配的行数

例如,inv_dtl中的一行在TPO中可能有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

只需使用常规组,这样可以减少行数。但由于我不知道您想要从第一个提到的表中得到什么列,所以我刚刚发明了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()
densite\u RANK()
如果数据是“等秩”的,则可以重复数字。要保证每行有一个唯一的整数,请使用
行数()

只需使用一个常规组即可减少行数。但由于我不知道您想要从第一个提到的表中得到什么列,所以我刚刚发明了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()
densite\u RANK()
如果数据是“等秩”的,则可以重复数字。要保证每行有一个唯一的整数,请使用
row\u NUMBER()

我已尽了最大努力使用您的代码,但您可能应该检查缩进是否符合预期。不要试图在HTML中发布;降价对每个人来说都要简单得多。代码应该缩进四个空格;这就把它变成了一个
段。感谢您更正我的代码,以后我不会用HTML发布,而是会使用markdown。始终:指出(用标记)您实际使用的dbms,“sql”不足以说明使用哪种方言是相关的如果
inv\u dtl
有唯一的键,请使用
COUNT(DISTINCT inv\u dtl.UniqueKey)
以确保只计算一次。我已尽我所能使用您的代码,但您可能应该检查缩进是否符合预期。不要试图在HTML中发布;降价对每个人来说都要简单得多。代码应该缩进四个空格;这就把它变成了一个
段。感谢您更正我的代码,以后我不会用HTML发布,而是会使用markdown。始终:指出(用标记)您实际使用的dbms,“sql”不足以说明使用哪种方言是相关的如果
inv\u dtl
有唯一的键,请使用
COUNT(DISTINCT inv\u dtl.UniqueKey)
以确保只计算一次。