Comment puis-je ajouter correctement cette requête dans ma requête existante au sein de Concepteur de Requêtes?

0

La question

J'ai actuellement le ci-dessous requête écrite au sein de Concepteur de Requêtes. J'ai posé une question hier et il a travaillé sur son propre, mais je voudrais l'intégrer dans mon rapport.

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'

Ma question d'hier était que je voulais un moyen de sélectionner uniquement la première observation faite pour chaque vente. J'ai une requête pour sélectionner le pavillon de commentaires, mais je veux à la fois la première ligne et le pavillon de commentaires. Ils seraient tous les deux en tirant à partir de la même table. C'était la requête présentée et il a travaillé sur son propre, mais je ne peux pas comprendre comment le faire fonctionner avec ma requête existante.

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

Je vous remercie beaucoup pour votre aide.

query-designer sql-server
2021-11-23 17:24:55
1

La meilleure réponse

0

Vous pouvez utiliser une combinaison de la ligne de numérotation et de l'agrégation d'obtenir à la fois l' Flagged% les commentaires, et le premier commentaire.

Vous pouvez modifier la PARTITION BY la clause de costume.

DISTINCT sur la requête externe est probablement faux, sur la requête interne, il est certainement, comme vous l'avez GROUP BY de toute façon. Si vous obtenez plusieurs lignes, ne pas simplement jeter DISTINCT chez elle, au lieu de penser à vos jointures et si vous avez besoin d'agrégation.

La deuxième LEFT JOIN logiquement devient un INNER JOIN en raison de la WHERE prédicat. Peut-être que le prédicat doit avoir été dans le ON au lieu de cela?

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-23 23:52:06

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................