【问题标题】:Filtering Duplicates from UNION results based on 2 columns根据 2 列从 UNION 结果中过滤重复项
【发布时间】:2017-01-22 21:54:45
【问题描述】:

我得到两个选择查询的 UNION,其中一个被查询的表是一个临时表,以确保输出记录(因此临时表具有每个日期的预期输出,但默认值为 0销售专栏

示例输出结果如下所示:

ProductID  | Product Desc | TransactionDate | Sale
1011021    | SD DOG       | 2017-01-07      | 0
1011021    | SD DOG       | 2017-01-07      | $17
1011021    | SD DOG       | 2017-01-14      | 0
1011021    | SD DOG       | 2017-01-14      | $15
1011021    | SD DOG       | 2017-01-21      | $21
1011021    | SD DOG       | 2017-01-28      | 0
1011021    | SD DOG       | 2017-01-28      | $21

Union 根据行删除重复项,如何使其根据 productID 和 transactionDate 列删除重复项,删除 Sale 为 0 的重复项?

--在下面查询

SELECT transactionProducts.productID, products.productDesc, sum(salePrice) as Sale, transactionDate 
FROM products LEFT JOIN transactionProducts on products.productID = transactionProducts.productID 
LEFT JOIN transactions ON transactionProducts.transactionID = transactions.transactionID 
LEFT JOIN productCategory on productCategory.productID = products.productID 
LEFT JOIN categories on categories.categoryID = productCategory.categoryID
WHERE (transactionProducts.productID='123' AND transactions.transactionDate='2017-01-12'
Group by transactionProducts.productID, transactionDate
UNION select * from "temptable" group by productID, productDesc, Sale, transactionDate 
ORDER BY transactionDate

【问题讨论】:

  • 如果Sale 的值都为零,或者两者都不为零,会发生什么情况?

标签: sql sql-server sql-server-2008 azure-sql-database


【解决方案1】:

使用not exists 从临时表中选择尚未在结果集中的行:

. . .
UNION ALL
SELECT tt.*
FROM temptable tt
WHERE NOT EXISTS (SELECT 1
                  FROM transactionproducts tp JOIN
                       transaction t
                       ON t.transactionID = tp.transactionID
                  WHERE tp.productId = tt.productId AND
                        t.transactionDate = tt.transactionDate
                 )
GROUP BY productID, productDesc, Sale, transactionDate 
ORDER BY transactionDate

【讨论】:

    【解决方案2】:

    这个怎么样:

    SELECT transactionProducts.productID, products.productDesc, sum(salePrice) as Sale, transactionDate 
    FROM products LEFT JOIN transactionProducts on products.productID = transactionProducts.productID 
    LEFT JOIN transactions ON transactionProducts.transactionID = transactions.transactionID 
    LEFT JOIN productCategory on productCategory.productID = products.productID 
    LEFT JOIN categories on categories.categoryID = productCategory.categoryID
    WHERE (transactionProducts.productID='123' AND transactions.transactionDate='2017-01-12' 
              AND sum(salePrice) > 0 )
    Group by transactionProducts.productID, transactionDate
    UNION select * from "temptable" group by productID, productDesc, Sale, transactionDate 
    ORDER BY transactionDate
    

    注意,我在第一个 SELECT WHERE 子句中添加了“AND sum(salePrice) > 0”。

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多