连接表然后对不同的值求和
Join tables then sum on distinct values
我正在应对 Adventureworks 的一些挑战,并且我正在尝试削减 down/summarize 加入的 table。
以下正确连接了我的两个 table 并生成了 3 列:
use AdventureWorks2012
select datename(dw,orderdate ) as "Day", LineTotal,OrderQty
from sales.SalesOrderDetail join sales.SalesOrderHeader
on (SalesOrderDetail.SalesOrderID=SalesOrderHeader.SalesOrderID)
稍微调整一下,结果 table 只显示星期一、星期二、星期三等不同的日期...
use AdventureWorks2012
select distinct(datename(dw,orderdate)) as "Day"
from sales.SalesOrderDetail join sales.SalesOrderHeader
on (SalesOrderDetail.SalesOrderID=SalesOrderHeader.SalesOrderID)
我正在尝试找出每天如何生成 LineTotal 总和和 OrderQty 总和,但没有成功。
我得到的最接近的是:
use AdventureWorks2012
select distinct(datename(dw,orderdate)) as "Day", sum(LineTotal), SUM(OrderQty)
from sales.SalesOrderDetail join sales.SalesOrderHeader
on (SalesOrderDetail.SalesOrderID=SalesOrderHeader.SalesOrderID)
group by OrderDate
然而,这会产生很多很多行,而不是仅仅 7 行以及随之而来的总计 LineTotal、OrderQty。
感谢您的任何建议。
我没有冒险作品,但很确定你可以做这样的事情。请注意,我在这里使用别名是为了让这更容易一些。此外,使用日期部分和长手日期部分而不是短手。速记版比较难记
select OrderDay = datepart(dayofweek, soh.OrderDate)
, sum(sod.LineTotal)
, SUM(sod.OrderQty)
from sales.SalesOrderDetail sod
join sales.SalesOrderHeader soh on sod.SalesOrderID = soh.SalesOrderID
group by datepart(dayofweek, soh.OrderDate)
use AdventureWorks2012
select
datename(dw,orderdate ) as "Day",
SumLineTotal=SUM(LineTotal),
SumOrderQty=SUM(OrderQty)
from
sales.SalesOrderDetail
INNER join sales.SalesOrderHeader on (SalesOrderDetail.SalesOrderID=SalesOrderHeader.SalesOrderID)
group by
datename(dw,orderdate)
use AdventureWorks2012
select datename(dw,orderdate) as "Day", sum(LineTotal), SUM(OrderQty)
from sales.SalesOrderDetail join sales.SalesOrderHeader
on SalesOrderDetail.SalesOrderID=SalesOrderHeader.SalesOrderID
group by datename(dw,orderdate)
使用时,控制行形成的是group by
子句,而不是select
子句。因此,在 group by
子句中的 orderdate 列上使用 datename 函数。
另外,请注意 distinct
不是 函数。所以 distinct 后面的括号没有任何意义,实际上它们被忽略了。
在使用 group by
时不要使用 select distinct
,这是多余的。
我正在应对 Adventureworks 的一些挑战,并且我正在尝试削减 down/summarize 加入的 table。
以下正确连接了我的两个 table 并生成了 3 列:
use AdventureWorks2012
select datename(dw,orderdate ) as "Day", LineTotal,OrderQty
from sales.SalesOrderDetail join sales.SalesOrderHeader
on (SalesOrderDetail.SalesOrderID=SalesOrderHeader.SalesOrderID)
稍微调整一下,结果 table 只显示星期一、星期二、星期三等不同的日期...
use AdventureWorks2012
select distinct(datename(dw,orderdate)) as "Day"
from sales.SalesOrderDetail join sales.SalesOrderHeader
on (SalesOrderDetail.SalesOrderID=SalesOrderHeader.SalesOrderID)
我正在尝试找出每天如何生成 LineTotal 总和和 OrderQty 总和,但没有成功。
我得到的最接近的是:
use AdventureWorks2012
select distinct(datename(dw,orderdate)) as "Day", sum(LineTotal), SUM(OrderQty)
from sales.SalesOrderDetail join sales.SalesOrderHeader
on (SalesOrderDetail.SalesOrderID=SalesOrderHeader.SalesOrderID)
group by OrderDate
然而,这会产生很多很多行,而不是仅仅 7 行以及随之而来的总计 LineTotal、OrderQty。
感谢您的任何建议。
我没有冒险作品,但很确定你可以做这样的事情。请注意,我在这里使用别名是为了让这更容易一些。此外,使用日期部分和长手日期部分而不是短手。速记版比较难记
select OrderDay = datepart(dayofweek, soh.OrderDate)
, sum(sod.LineTotal)
, SUM(sod.OrderQty)
from sales.SalesOrderDetail sod
join sales.SalesOrderHeader soh on sod.SalesOrderID = soh.SalesOrderID
group by datepart(dayofweek, soh.OrderDate)
use AdventureWorks2012
select
datename(dw,orderdate ) as "Day",
SumLineTotal=SUM(LineTotal),
SumOrderQty=SUM(OrderQty)
from
sales.SalesOrderDetail
INNER join sales.SalesOrderHeader on (SalesOrderDetail.SalesOrderID=SalesOrderHeader.SalesOrderID)
group by
datename(dw,orderdate)
use AdventureWorks2012
select datename(dw,orderdate) as "Day", sum(LineTotal), SUM(OrderQty)
from sales.SalesOrderDetail join sales.SalesOrderHeader
on SalesOrderDetail.SalesOrderID=SalesOrderHeader.SalesOrderID
group by datename(dw,orderdate)
使用时,控制行形成的是group by
子句,而不是select
子句。因此,在 group by
子句中的 orderdate 列上使用 datename 函数。
另外,请注意 distinct
不是 函数。所以 distinct 后面的括号没有任何意义,实际上它们被忽略了。
在使用 group by
时不要使用 select distinct
,这是多余的。