/ / SQL Server: marque le pourcentage le plus élevé dans une table - sql, max, valeur, pourcentage, northwind

SQL Server: marque le pourcentage le plus élevé dans une table - sql, max, valeur, pourcentage, northwind

J'ai un petit doute, je fais quelques exercices avec le Northwind base de données. J'essaie d'obtenir un rapport indiquant les envois par année, avec le nombre total d'envois de chaque compagnie de transport. Elle doit également indiquer le pourcentage d’envois effectués par cette entreprise, puis indiquer quelle entreprise a effectué le plus d’envois (avec un «X» pour l’entreprise ayant effectué la plupart des envois et avec un «-» pour les autres), comme la partie commentée du code:

IF (Perc > 36, "X", "-")

J'ai déjà une partie du code, je ne lutte qu'avec la dernière partie.

Voici ce que j'ai

SELECT
/* First we get the years. */
DISTINCT YEAR(P.OrderDate) AS "ShipYear",

/* Now we get the names of the different shipping agencies. */
(SELECT Shippers.CompanyName
FROM dbo.Shippers
WHERE Shippers.ShipperID = P.ShipVia) AS "Shipper",

/* The next step is counting the total of shipments *
*  of that year with that company.                 */
(SELECT COUNT(C.ShipVia)
FROM dbo.Orders AS C
WHERE YEAR(C.OrderDate) = YEAR(P.OrderDate)
AND C.ShipVia = P.ShipVia) AS "Shipments",

/* Now we get it"s percentage. */
(SELECT (COUNT(C.ShipVia) * 100 /
(SELECT COUNT(*)
FROM dbo.Orders AS CC
WHERE YEAR(CC.OrderDate) = YEAR(P.OrderDate)))
FROM dbo.Orders AS C
WHERE YEAR(C.OrderDate) = YEAR(P.OrderDate)
AND C.ShipVia = P.ShipVia) AS "Perc"

--IF (Perc > 36, "X", "-")
FROM
[dbo].[Orders] AS P
WHERE
P.OrderDate IS NOT NULL
ORDER BY
YEAR(P.OrderDate)
GO

Et voici une capture d'écran du rapport:

Rapport de table

Merci beaucoup pour votre aide!

Réponses:

1 pour la réponse № 1

Vous recherchez des fonctions de fenêtrage, en utilisant le OVER clause.

Vous n’avez pas spécifié la base de données que vous utilisez, je me suis donc lié à Microsoft SQL Server ci-dessus.

Depuis Perc colonne est une sous-requête, vous devriez envelopper votre SELECT déclaration avec une autre comme celle-ci:

SELECT "ShipYear", "Shipper", "Shipments", "Perc"
, MAX("Perc") OVER (PARTITION BY "ShipYear") AS `MaxPerc`
FROM ( // your query goes here
) x

Cela va vous montrer comment ça marche. Puisque tu veux X ou -, vous faites cela à la place:

SELECT "ShipYear", "Shipper", "Shipments", "Perc"
, CASE WHEN "Perc" = MAX("Perc") OVER (PARTITION BY "ShipYear")
THEN "X"
ELSE "-"
END AS "Best"
FROM ( // your query goes here
) x