SQL服务器:标记table中的最大百分比值
SQL Server : mark the biggest percentage value in a table
我有点怀疑,我正在用 Northwind
数据库做一些练习。我正在尝试获取一份报告,按年份显示出货量,以及每个船运公司的出货量总数。它还需要显示该公司完成的出货量百分比,然后需要显示出货量最多的公司("X" 表示出货量最多的公司,“-”表示其余公司) ,喜欢代码的注释部分:
IF (Perc > 36, "X", "-")
我已经有了部分代码,我只是在为最后一部分苦苦挣扎。
这是我的:
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
这是报告的屏幕截图:
非常感谢您的帮助!
您正在寻找窗口函数,使用 OVER
子句。
您没有指定您使用的是哪个数据库,所以我链接到上面的 Microsoft SQL 服务器。
因为 Perc
列是一个 sub-query,你应该用这样的另一个包裹你的 SELECT
语句:
SELECT 'ShipYear', 'Shipper', 'Shipments', 'Perc'
, MAX('Perc') OVER (PARTITION BY 'ShipYear') AS `MaxPerc`
FROM ( // your query goes here
) x
这将向您展示它是如何工作的。由于您想要 X
或 -
,因此您可以这样做:
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
我有点怀疑,我正在用 Northwind
数据库做一些练习。我正在尝试获取一份报告,按年份显示出货量,以及每个船运公司的出货量总数。它还需要显示该公司完成的出货量百分比,然后需要显示出货量最多的公司("X" 表示出货量最多的公司,“-”表示其余公司) ,喜欢代码的注释部分:
IF (Perc > 36, "X", "-")
我已经有了部分代码,我只是在为最后一部分苦苦挣扎。
这是我的:
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
这是报告的屏幕截图:
非常感谢您的帮助!
您正在寻找窗口函数,使用 OVER
子句。
您没有指定您使用的是哪个数据库,所以我链接到上面的 Microsoft SQL 服务器。
因为 Perc
列是一个 sub-query,你应该用这样的另一个包裹你的 SELECT
语句:
SELECT 'ShipYear', 'Shipper', 'Shipments', 'Perc'
, MAX('Perc') OVER (PARTITION BY 'ShipYear') AS `MaxPerc`
FROM ( // your query goes here
) x
这将向您展示它是如何工作的。由于您想要 X
或 -
,因此您可以这样做:
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