-1

我目前在查询设计器中编写了以下查询。我昨天问了一个问题,它可以自行运行,但我想将其合并到我现有的报告中。

SELECT Distinct
       i.ProductNumber
  ,i.ProductType
  ,i.ProductPurchaseDate
  ,ih.SalesPersonComputerID
  ,ih.SalesPerson
  ,ic2.FlaggedComments

FROM [Products] i
        
LEFT OUTER JOIN 
    (SELECT Distinct
        MIN(c2.Comments) AS FlaggedComments
        ,c2.SalesKey 
        FROM [SalesComment] AS c2
        WHERE(c2.Comments like 'Flagged*%')
        GROUP BY c2.SalesKey) ic2 
    ON ic2.SalesKey = i.SalesKey

LEFT JOIN [SalesHistory] AS ih
    ON ih.SalesKey = i.SalesKey

WHERE
  i.SaleDate  between @StartDate and @StopDate
AND ih.Status = 'SOLD'

我昨天的问题是,我想要一种方法来只选择每次销售的第一条评论。我有一个选择标记评论的查询,但我想要第一行和标记评论。他们都会从同一张桌子上拉出来。这是提供的查询,它自己工作,但我不知道如何使它与我现有的查询一起工作。

SELECT a.DateTimeCommented, a.ProductNumber, a.Comments, a.SalesKey 
FROM (
    SELECT 
            DateTimeCommented, ProductNumber, Comments, SalesKey,
            ROW_NUMBER() OVER(PARTITION BY ProductNumber ORDER BY DateTimeCommented) as RowN
    FROM [SalesComment]
    ) a 
WHERE a.RowN = 1

非常感谢您的帮助。

4

1 回答 1

0

您可以结合使用行编号和聚合来获取Flagged%评论和第一条评论。

您可能需要更改PARTITION BY条款以适应。

DISTINCT在外部查询上可能是虚假的,在内部查询上它肯定是GROUP BY,无论如何你都有。如果你得到多行,不要只是扔掉DISTINCT它,而是考虑你的连接以及是否需要聚合。

第二个LEFT JOIN逻辑上变成了INNER JOIN由于WHERE谓词。也许那个谓词应该ON代替?

SELECT
   i.ProductNumber
  ,i.ProductType
  ,i.ProductPurchaseDate
  ,ih.SalesPersonComputerID
  ,ih.SalesPerson
  ,ic2.FlaggedComments
  ,ic2.FirstComments

FROM [Products] i
        
LEFT OUTER JOIN 
    (SELECT
        MIN(CASE WHEN c2.RowN = 1 THEN c2.Comments) AS FirstComments
        ,c2.SalesKey 
        ,MIN(CASE WHEN c2.Comments like 'Flagged*%' THEN c2.Comments) AS FlaggedComments
        FROM (
            SELECT *,
              ROW_NUMBER() OVER (PARTITION BY ProductNumber ORDER BY DateTimeCommented) as RowN
            FROM [SalesComment]
        ) AS c2
        GROUP BY c2.SalesKey
    ) ic2 ON ic2.SalesKey = i.SalesKey

JOIN [SalesHistory] AS ih
    ON ih.SalesKey = i.SalesKey

WHERE
  i.SaleDate between @StartDate and @StopDate
AND ih.Status = 'SOLD'
于 2021-11-23T23:52:06.853 回答