0

我的数据库中有 2 个表

表格1

 DC     Item     Day
6006    123      May 1
6006    123      May 2
7036    456      May 6

表 2

 DC     Item      Day    ShippedCases    Label Type
6006    123      May 1       100             A
6006    123      May 2       200             A
6006    123      May 2       500             B 
7036    456      May 2       300             B
7036    456      May 6       400             A

表 1 包含我感兴趣的所有唯一记录,但它不包含 ShippedCases 或标签类型。如何编写查询以从表 2 中选择与表 1 中的记录匹配的所有记录?

在这种情况下,我想选择表 2 中与表 1 匹配的 DC、项目、日期字段,并对标签类型 = A 的已发货案例求和。

结果视图

DC       Item   Day     Shipped Cases    Label Type
6006     123    May 1        100              A
6006     123    May 2        200              A 
7036     456    May 6        400              A

我认为这是一个简单的 Select 语句,但我不知道如何设置我的 where 子句,我的前 3 个参数是表 1 字段和表 2 标签类型 = A 的第 4 个参数。

任何意见,将不胜感激!

4

1 回答 1

0

您想在此处使用 INNER JOIN 并使用和SUM()聚合GROUP BY

SELECT
    table1.DC,
    table1.Item,
    table1.Day,
    Sum(table2.ShippedCases) as ShippedCases,
    Table2.LabelType
FROM
    Table1
    INNER JOIN Table2 
        ON Table1.DC = Table2.DC
            AND Table1.Item = Table2.Item
            AND Table1.Day = Table2.Day
WHERE
    Table2.LabelType = 'A'
GROUP BY 1,2,3,5

如果您在 Table1 中有没有出现在 Table2 中的项目,那么您需要将其转换为 LEFT OUTER JOIN:

SELECT
    table1.DC,
    table1.Item,
    table1.Day,
    Sum(table2.ShippedCases) as ShippedCases,
    Table2.LabelType
FROM
    Table1
    LEFT OUTER JOIN Table2 
        ON Table1.DC = Table2.DC
            AND Table1.Item = Table2.Item
            AND Table1.Day = Table2.Day
            AND Table2.LabelType = 'A'
GROUP BY 1,2,3,5

请注意,我们将 WHERE 子句向上移动到 LEFT OUTER JOIN 的 ON 子句中,以确保只有 Table2 中的项目受该 LabelType 的限制。换句话说,Teradata 将在加入 Table1 之前过滤 Table2。因为它是 LEFT OUTER JOIN,所以您将从 Table1 中获取所有记录,然后仅从 Table2 中获取通过过滤器并匹配 ON 条件的记录。

于 2018-05-02T16:57:54.670 回答