【发布时间】:2022-11-28 22:09:51
【问题描述】:
我是这个编码爱好者的新手,不想告诉你我花了多长时间才得到下面的输出……它确实做了我想要的,但我确信必须有更有效的方法来实现它,我花了那么长时间现在虽然我看不到其他任何东西!
WITH
Italian_Sales as(
SELECT sum(od.quantityOrdered) as total_it, od.productCode as product_it
FROM orderdetails as od
JOIN orders as o
ON od.orderNumber = o.orderNumber
JOIN customers as c
ON o.customerNumber = c.customerNumber
JOIN products as p
ON p.productCode = od.productCode
WHERE c.country in ("Italy")
GROUP BY product_it
),
Spanish_Sales as(
SELECT sum(od.quantityOrdered) as total_sp, od.productCode as product_sp
FROM orderdetails as od
JOIN orders as o
ON od.orderNumber = o.orderNumber
JOIN customers as c
ON o.customerNumber = c.customerNumber
JOIN products as p
ON p.productCode = od.productCode
WHERE c.country in ("Spain")
GROUP BY product_sp
),
French_Sales as(
SELECT sum(od.quantityOrdered) as total_fr, od.productCode as product_fr
FROM orderdetails as od
JOIN orders as o
ON od.orderNumber = o.orderNumber
JOIN customers as c
ON o.customerNumber = c.customerNumber
JOIN products as p
ON p.productCode = od.productCode
WHERE c.country in ("France")
GROUP BY product_fr
),
UK_Sales as(
SELECT sum(od.quantityOrdered) as total_uk, od.productCode as product_uk
FROM orderdetails as od
JOIN orders as o
ON od.orderNumber = o.orderNumber
JOIN customers as c
ON o.customerNumber = c.customerNumber
JOIN products as p
ON p.productCode = od.productCode
WHERE c.country in ("UK")
GROUP BY product_uk
),
Total_Sales as(
SELECT sum(od.quantityOrdered) as total_sales, od.productCode as product_total
FROM orderdetails as od
JOIN orders as o
ON od.orderNumber = o.orderNumber
JOIN customers as c
ON o.customerNumber = c.customerNumber
JOIN products as p
ON p.productCode = od.productCode
WHERE c.country in ("Spain", "France", "UK", "Italy")
GROUP BY product_total
)
SELECT p.productCode, p.productLine, p.productName, ts.total_sales as "Total Sales", its.total_it as "Italian Sales",
ss.total_sp as "Spanish Sales", fs.total_fr as "French Sales", us.total_uk as "UK Sales"
FROM products as p
LEFT JOIN Italian_Sales as its
ON p.productCode = product_it
LEFT JOIN Spanish_Sales as ss
ON p.productCode = product_sp
LEFT JOIN French_Sales as fs
ON p.productCode = product_fr
LEFT JOIN UK_Sales as us
ON p.productCode = product_uk
LEFT JOIN Total_Sales as ts
ON p.productCode = product_total
GROUP BY p.productCode
ORDER BY ts.total_sales DESC;
所需的输出低于每个国家/地区的销售额和总金额,但在适用的情况下也显示空值(这是我花了很长时间才记得离开加入的原因)
【问题讨论】:
-
这将是
PIVOT的一个很好的候选人 -
而不是所有单独的、几乎相同的查询,只需将国家/地区包含在一个查询的分组依据中(如果需要限制国家/地区,则可以在这些国家/地区添加 WHERE 子句过滤器)
标签: sql optimization