每个地点最常订购什么包裹?
What package is ordered most often at each location?
我一直无法找到这个问题的结果。
以下是我的 table 结构详细信息:
studios
(
studio_id,
location
)
photo_sessions
(
session_id,
studio_id,
cust_id,
session_length,
session_date
)
customer
(
cust_id,
cus_first,
cus_last,
emailid
)
order
(
order_id,
cust_id,
order_description,
amount
)
package_order
(
package_order_id,
order_id,
package_id,
price,
quantity
)
package
(
package_id,
package_name
)
我想找出每个地点最常订购的包裹。
我试过这个查询,
SELECT
p.package_name,
s.location,
count(p.package_id)
FROM package p,
package_order po,
order_table o,
customer c,
photo_sessions ps,
studios s
WHERE p.package_id=po.package_id
and po.order_id=o.order_id
and o.cust_id=c.cust_id
and c.cust_id=ps.cust_id
and ps.studio_id=s.studio_id
GROUP BY p.package_name,
s.location
HAVING COUNT (p.package_id)=
(
SELECT MAX(mycount)
FROM (
SELECT package_id, COUNT(package_id) as mycount
FROM package_order
GROUP BY package_id
) as most_order
);
我不确定它给出的结果是否正确。任何帮助将不胜感激。
您可以使用 window 函数执行此操作:
WITH cte as (
SELECT
p.package_name,
s.location,
count(p.package_id) AS mycount,
row_number() over(partition by s.location order by count(p.package_id) desc) AS rn
FROM package p
JOIN package_order po ON p.package_id = po.package_id
JOIN order_table o ON po.order_id = o.order_id
JOIN customer c ON o.cust_id = c.cust_id
JOIN photo_sessions ps ON c.cust_id = ps.cust_id
JOIN studios s ON ps.studio_id = s.studio_id
GROUP BY p.package_name,
s.location)
SELECT * FROM cte
WHERE rn = 1
PS:您使用 Sql Server 2012,但加入了旧式已弃用的语法。是时候忘掉旧的了。
编辑:
WITH cte as (
SELECT
p.package_name,
s.location,
count(p.package_id) AS mycount
FROM package p
JOIN package_order po ON p.package_id = po.package_id
JOIN order_table o ON po.order_id = o.order_id
JOIN customer c ON o.cust_id = c.cust_id
JOIN photo_sessions ps ON c.cust_id = ps.cust_id
JOIN studios s ON ps.studio_id = s.studio_id
GROUP BY p.package_name,
s.location)
SELECT * FROM cte c1
CROSS APPLY(SELECT MAX(mycount) mycount FROM cte c2 WHERE c1.location = c2.location) ca
WHERE c1.mycount = ca.mycount
我一直无法找到这个问题的结果。
以下是我的 table 结构详细信息:
studios
(
studio_id,
location
)
photo_sessions
(
session_id,
studio_id,
cust_id,
session_length,
session_date
)
customer
(
cust_id,
cus_first,
cus_last,
emailid
)
order
(
order_id,
cust_id,
order_description,
amount
)
package_order
(
package_order_id,
order_id,
package_id,
price,
quantity
)
package
(
package_id,
package_name
)
我想找出每个地点最常订购的包裹。
我试过这个查询,
SELECT
p.package_name,
s.location,
count(p.package_id)
FROM package p,
package_order po,
order_table o,
customer c,
photo_sessions ps,
studios s
WHERE p.package_id=po.package_id
and po.order_id=o.order_id
and o.cust_id=c.cust_id
and c.cust_id=ps.cust_id
and ps.studio_id=s.studio_id
GROUP BY p.package_name,
s.location
HAVING COUNT (p.package_id)=
(
SELECT MAX(mycount)
FROM (
SELECT package_id, COUNT(package_id) as mycount
FROM package_order
GROUP BY package_id
) as most_order
);
我不确定它给出的结果是否正确。任何帮助将不胜感激。
您可以使用 window 函数执行此操作:
WITH cte as (
SELECT
p.package_name,
s.location,
count(p.package_id) AS mycount,
row_number() over(partition by s.location order by count(p.package_id) desc) AS rn
FROM package p
JOIN package_order po ON p.package_id = po.package_id
JOIN order_table o ON po.order_id = o.order_id
JOIN customer c ON o.cust_id = c.cust_id
JOIN photo_sessions ps ON c.cust_id = ps.cust_id
JOIN studios s ON ps.studio_id = s.studio_id
GROUP BY p.package_name,
s.location)
SELECT * FROM cte
WHERE rn = 1
PS:您使用 Sql Server 2012,但加入了旧式已弃用的语法。是时候忘掉旧的了。
编辑:
WITH cte as (
SELECT
p.package_name,
s.location,
count(p.package_id) AS mycount
FROM package p
JOIN package_order po ON p.package_id = po.package_id
JOIN order_table o ON po.order_id = o.order_id
JOIN customer c ON o.cust_id = c.cust_id
JOIN photo_sessions ps ON c.cust_id = ps.cust_id
JOIN studios s ON ps.studio_id = s.studio_id
GROUP BY p.package_name,
s.location)
SELECT * FROM cte c1
CROSS APPLY(SELECT MAX(mycount) mycount FROM cte c2 WHERE c1.location = c2.location) ca
WHERE c1.mycount = ca.mycount