2017-02-22 28 views
1

我碰到了一個障礙,似乎無法弄清楚這一點。我懷疑這個答案正在盯着我,但似乎無法把我的大腦包圍起來,而且我也找不到在線解決方案。按人物排前十位,按人排列

我試圖找出每個員工在給定範圍內每天完成的最後一個訂單。問題是訂單號碼不是順序的,所以我不能只用MAX()函數來查找它。最後,我不需要任何東西,除了 OrderNums的列表(每個員工每天的最後一個),因爲這將被添加到另一個查詢中。

這是我到目前爲止有:

SELECT  
    (SELECT USERNAME FROM EMPLOYEES WHERE TechID = Invoices.TechID1) AS "Tech" 
      ,CONVERT(date, OrderDate) AS "OrderDate" 
     FROM Invoices 
       WHERE OrderDate BETWEEN CONVERT(date, DATEADD(day, -60, GETDATE())) AND CONVERT(date, GETDATE()) 
     GROUP BY 
      TechID1, OrderDate 

     ORDER BY  
      "Tech" DESC, OrderDate DESC 

這將返回每個員工每一天,這是偉大的一個線,但我無法弄清楚如何指定每一天的最後一個訂單號。這樣做的最好的領域是超時(時間發票結束了),所以我一直在試圖SELECT子句中添加一行像

(SELECT TOP 1 OrderNum FROM Invoices ii Where ii.TechID1 = Invoices.TechID1 AND ii.OrderDate = Invoices.OrderDate ORDER BY TimeOut DESC) 

但這並不一致好像有應該是一個更簡單的方法來做到這一點。看起來你應該能夠將OrderNum添加到SELECT子句中,但會引發錯誤(42000 - [SQL Server]列'Invoices.OrderNum'在選擇列表中無效,因爲它不包含在聚合函數中或GROUP BY子句。)

有什麼建議嗎?

P.S.你們真棒。我得到很多通過淘洗此網站回答的問題。我還不能在這裏回覆,因爲我太綠了,所以我現在要說謝謝!

- 編輯 -

戈登Linhoff - 感謝您的建議。這很有幫助,但是它只能爲每個人返回幾個結果,並且我們預計在60天期間會有近40個結果。我會做一些挖掘這個操作,因爲我不知道這是一件事情。我對SQL依然很陌生。

McNetsydoow - 我不知道你想什麼所有的細節,但希望這是有幫助的:

發票表

  • LocationID
  • InvoiceNum
  • WorkDate
  • TimeOut
  • TechID1
  • (這裏不太可能有幫助的其他列的加載。)

EmployeesTable

  • 用戶名
  • TechID
  • (即不太可能有幫助這裏等欄目的負載。)

此外,如果您有所幫助。目前的查詢看起來像這樣:

SELECT 
    ... 
FROM Invoices WHERE 
    OrderNum IN (
     SELECT "Last OrderNum" FROM 
     (SELECT 
      (SELECT TOP 1 OrderNum FROM PestPac.dbo.INVOICES WHERE (TechID1 = Employees.TechID OR TechID2 = Employees.TechID) 
        AND NOT (OrderNum IS NULL) 
        AND NOT (InvoiceType = 'NS') --Not Serviced 
        AND VOID = 0 --Not Voided 
        AND CONVERT(date,WorkDate)= CONVERT(date, DATEADD(day, -7, GETDATE())) 
        AND NOT (OrderType = 'NS') ORDER BY WorkDate DESC) AS "Last OrderNum" 
        FROM Employees 
        WHERE 
         AND Employees.active = 1 
     ) todayMinusSeven) 
OR 
    OrderNum IN (...) todayMinusSix) 
OR 
    OrderNum IN (...) todayMinusFive) 
OR 
    OrderNum IN (...) todayMinusFour) 
OR 
    OrderNum IN (...) todayMinusThree) 
OR 
    OrderNum IN (...) todayMinusTwo) 
OR 
    OrderNum IN (...) todayMinusOne) 

基本上,我對員工表使用子查詢來獲取每個人在給定日期完成的最後一個訂單號,然後在目標日更改的情況下重複相同的查詢。這給了我7個訂單號列表,我轉過身來用它來過濾發票表,然後從那裏獲取我想要的數據。這是一個文明時代的不起眼的武器。如上所述,此更改的目標是使用一個包含工件的BETWEEN X和Y子句的子查詢。

+0

請添加員工和發票的最小表格模式。 – McNets

+0

看起來像一個問題可以通過常見的表格來解決?如果您可以提供樣本數據和預期輸出,會更容易。 – ydoow

回答

1

嗯。我認爲你可以使用row_number()

SELECT i.* 
FROM (SELECT i.*, 
      ROW_NUMBER() OVER (PARTITION BY TechId1, CONVERT(date, OrderDate) ORDER BY OrderDate DESC) as seqnum 
     FROM Invoices i 
     WHERE OrderDate BETWEEN CONVERT(date, DATEADD(day, -60, GETDATE())) AND CONVERT(date, GETDATE()) 
    ) i 
WHERE seqnum = 1; 

這將選擇整個行。您可以選擇所需的特定列。