2014-09-02 80 views
0

我正在查看包含有關訂單信息的數據庫。我試圖確定從訂購時間起至發貨時間超過14天的訂單的百分比。我很難創建每月%的列。現在我有SQL查找兩個計數的百分比

Select ol.orderid, ol.productid, Month(ol.shipdate) as monthShipped, 
     Year(ol.shipdate)as yearShipped, 
     (Select Count(*) From orderline ol Where datediff(ol.shipdate,o.orderdate)> 14 Group By Month(ol.shipdate), Year(ol.shipdate))/Count(*) as percentage 
From orderline ol 
Join orders o 
    on ol.orderid = o.orderid 
Group By monthShipped, yearShipped 
Order By yearShipped, monthShipped 

我收到一個錯誤,說我的子查詢返回多行。我不想要多行?如果我在子查詢中刪除了Group By,那麼我可以獲得價值,但是它並沒有靠近右邊。

+0

請不要使用不適用於您的問題的標籤。謝謝。 – 2014-09-02 01:58:29

+2

@John你是怎麼認定這個問題是關於MySQL而不是SQL Server的?也許問,而不是僅僅假設。 :-)看起來更像SQL Server給我的。 – 2014-09-02 01:59:28

+0

@AaronBertrand新開發人員傾向於傾向於MySQL,因此這是一個有教養的猜測。 :)但是,如果你認爲我錯了,肯定會做出相應的改變。 – 2014-09-02 02:00:49

回答

0

第一個問題是,shipdate是針對每個訂單行。讓我假設你的意思是最新的每個訂單的發貨日期。下面的順序水平得到這樣的信息:

Select ol.orderid, max(ol.shipdate) as lastshipdate 
From orderline ol 
Group By ol.orderid; 

要獲得這些內容,你需要的訂單:

Select ol.orderid, datediff(o.orderdate, max(ol.shipdate)) as diff 
From orders o join 
     orderline ol 
     on o.orderid = ol.orderid 
Group By ol.orderid; 

最後,每月能拿到的數量和百分比:

select year(orderdate), month(orderdate), 
     count(*) as numorders, sum(diff > 14) as numdelayed, avg(diff > 14) as p_dealyed 
from (Select ol.orderid, datediff(o.orderdate, max(ol.shipdate)) as diff, o.orderdate 
     From orders o join 
      orderline ol 
      on o.orderid = ol.orderid 
     Group By ol.orderid 
    ) o 
group by year(orderdate), month(orderdate) 
order by 1, 2; 
0

第一個查詢返回訂單按發貨月份分組後的14天以上發貨的訂單項的百分比。

select monthShipped, yearShipped, 
    (sum(greater_than_14)/count(*)) percent_exceeding_14 
from (
    select 
     month(ol.shipdate) as monthShipped, 
     year(ol.shipdate) as yearShipped,  
     (datediff(ol.shipdate,o.orderdate) > 14) greater_than_14 
    from orderline ol 
    join orders o on ol.orderid = o.orderid  
) t1 group by monthShipped, yearShipped 

第二屆查詢返回那裏下訂單後14天以上,按月訂購分組至少1訂單行項目被運往訂單%。

select monthOrdered, yearOrdered, 
    (count(g14)/count(*)) percent_exceeding_14 
from (
    select 
     month(orderdate) monthOrdered, 
     year(orderdate) yearOrdered, 
     greater_than_14.orderid g14 
    from orders o left join (
     select orderid 
     from orders o2 
     where exists (
      select 1 from orderline ol 
      where ol.orderid = o2.orderid 
      and datediff(ol.shipdate,o2.orderdate) > 14 
     ) 
    ) greater_than_14 on greater_than_14.orderid = o.orderid 
) t1 group by monthOrdered, yearOrdered