在 HAVING 子查询中指定要比较的列
Specifying a column to compare in HAVING subquery
我正在尝试比较 adventureworks 2014 中商店不同季度的销售额。
我的代码如下
SELECT store.BusinessEntityID as "StoreID", "Name"
from sales.SalesOrderHeader
inner join sales.customer
on sales.SalesOrderHeader.CustomerID = sales.customer.CustomerID
inner join sales.store
on sales.customer.StoreID= sales.store.BusinessEntityID
where (OrderDate between '2014-01-01' and '2014-03-31')
and (OnlineOrderFlag = 0)
group by store.BusinessEntityID, "Name"
having format(round(sum(subtotal),2),'###,###,###.##') > format(round(sum(subtotal),2),'###,###,###.##') IN
(
SELECT store.BusinessEntityID as "StoreID",
format(round(sum(subtotal),2),'###,###,###.##') "Ventes2013_Q4"
from sales.SalesOrderHeader
inner join sales.customer on sales.SalesOrderHeader.CustomerID = sales.customer.CustomerID
inner join sales.store on sales.customer.StoreID= sales.store.BusinessEntityID
where (orderdate between '2013-10-01' and '2013-12-31') and OnlineOrderFlag = 0
group by store.BusinessEntityID
)
我的主查询和我的子查询都是单独工作的,但我无法在 having 的第二部分中指定要与之比较的列。尝试 IN 时,它给了我一个不正确的语法,并且在使用列名时也不起作用。在主查询中添加销售列时也不起作用
谁能指出我正确的方向?
这是一种简单的方法(从您的代码翻译而来)
SELECT StoreID, Name
FROM (
SELECT store.BusinessEntityID as "StoreID", "Name", sum(stubtotal) as sum
from sales.SalesOrderHeader
inner join sales.customer on sales.SalesOrderHeader.CustomerID = sales.customer.CustomerID
inner join sales.store on sales.customer.StoreID= sales.store.BusinessEntityID
where (OrderDate between '2014-01-01' and '2014-03-31') and (OnlineOrderFlag = 0)
group by store.BusinessEntityID, "Name"
) first
JOIN (
SELECT BusinessEntityID, sum(subtotal) as sum
from sales.SalesOrderHeader
inner join sales.customer on sales.SalesOrderHeader.CustomerID = sales.customer.CustomerID
inner join sales.store on sales.customer.StoreID= sales.store.BusinessEntityID
where (orderdate between '2013-10-01' and '2013-12-31') and OnlineOrderFlag = 0
group by store.BusinessEntityID
) as sub on sub.BusinessEntityID = furst.BusinessEntityID
AND sub.sum < first.sum
然而 sql 服务器有更好的方法... 一秒钟。
这将为您提供按季度和存储的总计:
SELECT
store.BusinessEntityID as StoreID,
Name,
year(OrderDate) as y,
quarter(orderdate) as q,
sum(stubtotal) as sum
from sales.SalesOrderHeader
inner join sales.customer on sales.SalesOrderHeader.CustomerID = sales.customer.CustomerID
inner join sales.store on sales.customer.StoreID= sales.store.BusinessEntityID
group by store.BusinessEntityID, Name, year(OrderDate), quarter(orderdate)
现在创建视图
CREATE VIEW quarterview as
SELECT
store.BusinessEntityID as StoreID,
Name,
year(OrderDate) as y,
quarter(orderdate) as q,
sum(stubtotal) as sum
from sales.SalesOrderHeader
inner join sales.customer on sales.SalesOrderHeader.CustomerID = sales.customer.CustomerID
inner join sales.store on sales.customer.StoreID= sales.store.BusinessEntityID
group by store.BusinessEntityID, Name, year(OrderDate), quarter(orderdate)
"I want to show the stores that have more sales in 2014Q1 than in 2013Q4"
SELECT *
FROM quarterview first
WHERE q = 1 and year = 2014
然后
SELECT *
FROM quarterview first
JOIN quarterview second ON second.q = 4 and second.year=2013 and first.sum > second.sum
WHERE first.q = 1 and first.year = 2014
借助您出色的新季度视图,只需几行代码即可轻松处理所有客户请求。
With Ventes2014_Q1 as(
SELECT store.BusinessEntityID as "StoreID", "Name",format(round(sum(subtotal),2),'###,###,###.##') "Ventes2014_Q1"
from sales.SalesOrderHeader
inner join sales.customer
on sales.SalesOrderHeader.CustomerID = sales.customer.CustomerID
inner join sales.store
on sales.customer.StoreID= sales.store.BusinessEntityID
where (OrderDate between '2014-01-01' and '2014-03-31')
and (OnlineOrderFlag = 0)
group by store.BusinessEntityID, "Name"
),Ventes2013_Q4
(
SELECT store.BusinessEntityID as "StoreID",
format(round(sum(subtotal),2),'###,###,###.##') "Ventes2013_Q4"
from sales.SalesOrderHeader
inner join sales.customer on sales.SalesOrderHeader.CustomerID = sales.customer.CustomerID
inner join sales.store on sales.customer.StoreID= sales.store.BusinessEntityID
where (orderdate between '2013-10-01' and '2013-12-31') and OnlineOrderFlag = 0
group by store.BusinessEntityID
)
select "StoreID", "Name" from Ventes2014_Q1
where "StoreID" exists
(select "StoreID" from Ventes2013_Q4 where Ventes2013_Q4."StoreID"=Ventes2014_Q1."StoreID" and Ventes2014_Q1."Ventes2014_Q1">Ventes2013_Q4."Ventes2013_Q4")
我正在尝试比较 adventureworks 2014 中商店不同季度的销售额。 我的代码如下
SELECT store.BusinessEntityID as "StoreID", "Name"
from sales.SalesOrderHeader
inner join sales.customer
on sales.SalesOrderHeader.CustomerID = sales.customer.CustomerID
inner join sales.store
on sales.customer.StoreID= sales.store.BusinessEntityID
where (OrderDate between '2014-01-01' and '2014-03-31')
and (OnlineOrderFlag = 0)
group by store.BusinessEntityID, "Name"
having format(round(sum(subtotal),2),'###,###,###.##') > format(round(sum(subtotal),2),'###,###,###.##') IN
(
SELECT store.BusinessEntityID as "StoreID",
format(round(sum(subtotal),2),'###,###,###.##') "Ventes2013_Q4"
from sales.SalesOrderHeader
inner join sales.customer on sales.SalesOrderHeader.CustomerID = sales.customer.CustomerID
inner join sales.store on sales.customer.StoreID= sales.store.BusinessEntityID
where (orderdate between '2013-10-01' and '2013-12-31') and OnlineOrderFlag = 0
group by store.BusinessEntityID
)
我的主查询和我的子查询都是单独工作的,但我无法在 having 的第二部分中指定要与之比较的列。尝试 IN 时,它给了我一个不正确的语法,并且在使用列名时也不起作用。在主查询中添加销售列时也不起作用 谁能指出我正确的方向?
这是一种简单的方法(从您的代码翻译而来)
SELECT StoreID, Name
FROM (
SELECT store.BusinessEntityID as "StoreID", "Name", sum(stubtotal) as sum
from sales.SalesOrderHeader
inner join sales.customer on sales.SalesOrderHeader.CustomerID = sales.customer.CustomerID
inner join sales.store on sales.customer.StoreID= sales.store.BusinessEntityID
where (OrderDate between '2014-01-01' and '2014-03-31') and (OnlineOrderFlag = 0)
group by store.BusinessEntityID, "Name"
) first
JOIN (
SELECT BusinessEntityID, sum(subtotal) as sum
from sales.SalesOrderHeader
inner join sales.customer on sales.SalesOrderHeader.CustomerID = sales.customer.CustomerID
inner join sales.store on sales.customer.StoreID= sales.store.BusinessEntityID
where (orderdate between '2013-10-01' and '2013-12-31') and OnlineOrderFlag = 0
group by store.BusinessEntityID
) as sub on sub.BusinessEntityID = furst.BusinessEntityID
AND sub.sum < first.sum
然而 sql 服务器有更好的方法... 一秒钟。
这将为您提供按季度和存储的总计:
SELECT
store.BusinessEntityID as StoreID,
Name,
year(OrderDate) as y,
quarter(orderdate) as q,
sum(stubtotal) as sum
from sales.SalesOrderHeader
inner join sales.customer on sales.SalesOrderHeader.CustomerID = sales.customer.CustomerID
inner join sales.store on sales.customer.StoreID= sales.store.BusinessEntityID
group by store.BusinessEntityID, Name, year(OrderDate), quarter(orderdate)
现在创建视图
CREATE VIEW quarterview as
SELECT
store.BusinessEntityID as StoreID,
Name,
year(OrderDate) as y,
quarter(orderdate) as q,
sum(stubtotal) as sum
from sales.SalesOrderHeader
inner join sales.customer on sales.SalesOrderHeader.CustomerID = sales.customer.CustomerID
inner join sales.store on sales.customer.StoreID= sales.store.BusinessEntityID
group by store.BusinessEntityID, Name, year(OrderDate), quarter(orderdate)
"I want to show the stores that have more sales in 2014Q1 than in 2013Q4"
SELECT *
FROM quarterview first
WHERE q = 1 and year = 2014
然后
SELECT *
FROM quarterview first
JOIN quarterview second ON second.q = 4 and second.year=2013 and first.sum > second.sum
WHERE first.q = 1 and first.year = 2014
借助您出色的新季度视图,只需几行代码即可轻松处理所有客户请求。
With Ventes2014_Q1 as(
SELECT store.BusinessEntityID as "StoreID", "Name",format(round(sum(subtotal),2),'###,###,###.##') "Ventes2014_Q1"
from sales.SalesOrderHeader
inner join sales.customer
on sales.SalesOrderHeader.CustomerID = sales.customer.CustomerID
inner join sales.store
on sales.customer.StoreID= sales.store.BusinessEntityID
where (OrderDate between '2014-01-01' and '2014-03-31')
and (OnlineOrderFlag = 0)
group by store.BusinessEntityID, "Name"
),Ventes2013_Q4
(
SELECT store.BusinessEntityID as "StoreID",
format(round(sum(subtotal),2),'###,###,###.##') "Ventes2013_Q4"
from sales.SalesOrderHeader
inner join sales.customer on sales.SalesOrderHeader.CustomerID = sales.customer.CustomerID
inner join sales.store on sales.customer.StoreID= sales.store.BusinessEntityID
where (orderdate between '2013-10-01' and '2013-12-31') and OnlineOrderFlag = 0
group by store.BusinessEntityID
)
select "StoreID", "Name" from Ventes2014_Q1
where "StoreID" exists
(select "StoreID" from Ventes2013_Q4 where Ventes2013_Q4."StoreID"=Ventes2014_Q1."StoreID" and Ventes2014_Q1."Ventes2014_Q1">Ventes2013_Q4."Ventes2013_Q4")