Bonjour à tous. Je vais poster la procédure stockée dans toute sa gloire. N'hésitez pas à déchirer en lambeaux. L'auteur ne m'en voudra pas.Ma requête T-SQL lente nécessite une refonte complète
DECLARE @itemTypeID INT
SELECT @itemTypeID=ItemTypeID FROM dbo.ItemTypes WHERE ItemTypeName = 'Advert'
BEGIN
SELECT a.Active,
a.ParentClass,
a.Classification,
a.Variant,
FV."Full Views",
PV."Print Views",
EE."Email Enquiries",
a.ItemRef,
a.SiteID
FROM
(
SELECT DISTINCT i.ItemID,
i.ItemRef,
i.SiteID,
i.ParentClass,
i.Classification,
i.Summary AS "Variant",
i.Active
FROM Items i
JOIN Actions a
ON a.ItemID = i.ItemID
JOIN ActionTypes at
ON a.ActionTypeID = at.ActionTypeID
WHERE i.ItemTypeID = 1
AND a.DateAndTime BETWEEN @startDate AND @endDate
AND at.ActionTypeName IN ('Full view', 'Print view', 'Email enquiry')
AND ((@siteID = -1) OR (i.SiteID = @siteID))
AND ((@parentClass = '%') OR (i.ParentClass = @parentClass))
AND ((@class = '%') OR (i.classification = @class))
) a LEFT JOIN
(
SELECT i.ItemID,
COUNT(*) AS "Full Views"
FROM CustomerSites cs JOIN Items i
ON cs.SiteID = i.SiteID
JOIN Actions a
ON a.ItemID = i.ItemID
JOIN ActionTypes at
ON a.ActionTypeID = at.ActionTypeID
JOIN Sites s
ON cs.SiteID = s.SiteID
WHERE a.DateAndTime BETWEEN @startDate AND @endDate
AND i.ItemTypeID = @itemTypeID
AND at.ActionTypeName = 'Full view'
AND ((@customerID IS NULL) OR (cs.CustomerID = @customerID))
AND ((@siteID = -1) OR (cs.SiteID = @siteID))
AND ((@parentClass = '%') OR (i.ParentClass = @parentClass))
AND ((@class = '%') OR (i.classification = @class))
GROUP BY
i.ItemID
) FV
ON a.ItemID = FV.ItemID
LEFT JOIN
(
SELECT i.ItemID,
COUNT(*) AS "Print Views"
FROM CustomerSites cs JOIN Items i
ON cs.SiteID = i.SiteID
JOIN Actions a
ON a.ItemID = i.ItemID
JOIN ActionTypes at
ON a.ActionTypeID = at.ActionTypeID
JOIN Sites s
ON cs.SiteID = s.SiteID
WHERE a.DateAndTime BETWEEN @startDate AND @endDate
AND i.ItemTypeID = @itemTypeID
AND at.ActionTypeName = 'Print view'
AND ((@customerID IS NULL) OR (cs.CustomerID = @customerID))
AND ((@siteID = -1) OR (cs.SiteID = @siteID))
AND ((@parentClass = '%') OR (i.ParentClass = @parentClass))
AND ((@class = '%') OR (i.classification = @class))
GROUP BY
i.ItemID
) PV
ON a.ItemID = PV.ItemID
LEFT JOIN
(
SELECT i.ItemID,
COUNT(*) AS "Email Enquiries"
FROM CustomerSites cs JOIN Items i
ON cs.SiteID = i.SiteID
JOIN Actions a
ON a.ItemID = i.ItemID
JOIN ActionTypes at
ON a.ActionTypeID = at.ActionTypeID
JOIN Sites s
ON cs.SiteID = s.SiteID
WHERE a.DateAndTime BETWEEN @startDate AND @endDate
AND i.ItemTypeID = @itemTypeID
AND at.ActionTypeName = 'Email enquiry'
AND ((@customerID IS NULL) OR (cs.CustomerID = @customerID))
AND ((@siteID = -1) OR (cs.SiteID = @siteID))
AND ((@parentClass = '%') OR (i.ParentClass = @parentClass))
AND ((@class = '%') OR (i.classification = @class))
GROUP BY
i.ItemID
) EE
ON a.ItemID = EE.ItemID
UNION
SELECT '0','','','','','','','',''
Maintenant, tout ce que cela fait est de retourner quelques enregistrements et le nombre de fois qu'une action particulière s'est produite contre eux.
Un petit sous-ensemble devrait ressembler.
Description de l'objet Vues imprimées Emails
Item1 Desc1 12 NULL 1
Item2 Desc2 NULL NULL 3
Item3 Desc3 5 6 2
Espérons que vous pouvez voir ce qui se passe.
Je veux une liste d'éléments qui ont eu des actions les concernant pour une plage de dates particulière pour un client particulier pour un site particulier et la requête doit être filtrable sur la classe parente et la classification. Nice
La première sélection renvoie tous les éléments distincts qui correspondent aux critères de sélection.
Les 3 autres requêtes retournent simplement des comptages de 1 type d'action pour chaque élément. La requête est un pantalon lent même contre une petite quantité de données. Cela ne va jamais aller en direct, ça ne marchera pas.
Espérons que vous pouvez voir l'erreur des moyens 'auteurs' et le corriger.
pouvez-vous réellement lire cette requête? IMO le style indent est horrible. –
En bref, c'est 4 sous-requêtes jointes chanter JOINT GAUCHE – Robert
@Robert: S'il vous plaît consulter la balise existante. J'ai changé la balise de "T-SQL" en "TSQL" – Sung