在 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")