簡體   English   中英

SQL-在DateDiff上平均周末

[英]SQL - Average on DateDiff with taking out weekends

我有一條SQL語句,該語句可以計算我們的供應商延遲支付發票的天數。 它僅包括工作日,並且運行良好。 我的客戶現在在問我是否可以讓每個供應商平均延遲幾天。 這是我的代碼有效:

DATEDIFF(dd, PURCHTABLE.CONFIRMEDDLV, MAX(VENDPACKINGSLIPJOUR.DELIVERYDATE))
-(DATEDIFF(wk, PURCHTABLE.CONFIRMEDDLV, MAX(VENDPACKINGSLIPJOUR.DELIVERYDATE)) * 2)
-(CASE WHEN DATENAME(dw, PURCHTABLE.CONFIRMEDDLV) = 'Sunday'
       THEN 1
       ELSE 0
       END)
-(CASE WHEN DATENAME(dw, MAX(VENDPACKINGSLIPJOUR.DELIVERYDATE)) = 'Saturday'
       THEN 1
       ELSE 0
       END) AS 'DAYS LATE'

如果嘗試將其放在AVG() ,但它告訴我無法對聚合函數執行聚合函數。

更新:

這是我原來的SQL:

SELECT
    PURCHTABLE.PURCHNAME AS 'VENDOR NAME', 
    PURCHTABLE.ORDERACCOUNT AS 'VENDOR NUMBER',
    COUNT(DISTINCT PURCHTABLE.PURCHID) AS 'PURCHASE ORDER', 
    COUNT(PURCHLINE.LINENUMBER) AS 'NUMBER OF LINES', 
    SUM(PURCHLINE.LINEAMOUNT) AS 'PO PRICE TOTAL',
    DATEDIFF(dd, PURCHTABLE.CONFIRMEDDLV, MAX(VENDPACKINGSLIPJOUR.DELIVERYDATE))-(DATEDIFF(wk, PURCHTABLE.CONFIRMEDDLV, MAX(VENDPACKINGSLIPJOUR.DELIVERYDATE)) * 2)-(CASE WHEN DATENAME(dw, PURCHTABLE.CONFIRMEDDLV) = 'Sunday' THEN 1 ELSE 0 END)-(CASE WHEN DATENAME(dw, MAX(VENDPACKINGSLIPJOUR.DELIVERYDATE)) = 'Saturday' THEN 1 ELSE 0 END) AS 'DAYS LATE'
FROM
PURCHTABLE
JOIN 
PURCHLINE ON PURCHLINE.PURCHID = PURCHTABLE.PURCHID
JOIN
VENDPACKINGSLIPJOUR ON VENDPACKINGSLIPJOUR.PURCHID = PURCHTABLE.PURCHID
WHERE
PURCHTABLE.DELIVERYDATE >= '2017-01-01'
AND
PURCHTABLE.DELIVERYDATE <= '2017-01-20'
AND
PURCHTABLE.ORDERACCOUNT = 'VN03526'
GROUP BY  
PURCHTABLE.PURCHNAME, 
PURCHTABLE.ORDERACCOUNT,
PURCHTABLE.DELIVERYDATE,
PURCHTABLE.CONFIRMEDDLV

因此,我不太了解如何將其更改為您所說的.....我已經嘗試過了,但是沒有用。

SELECT 
    PURCHTABLE.PURCHNAME AS 'VENDOR NAME', 
    PURCHTABLE.ORDERACCOUNT AS 'VENDOR NUMBER'
FROM
    (SELECT
        PURCHTABLE.PURCHNAME AS 'VENDOR NAME', 
        PURCHTABLE.ORDERACCOUNT AS 'VENDOR NUMBER',
        COUNT(DISTINCT PURCHTABLE.PURCHID) AS 'PURCHASE ORDER', 
        COUNT(PURCHLINE.LINENUMBER) AS 'NUMBER OF LINES', 
        SUM(PURCHLINE.LINEAMOUNT) AS 'PO PRICE TOTAL',
        DATEDIFF(dd, PURCHTABLE.CONFIRMEDDLV, MAX(VENDPACKINGSLIPJOUR.DELIVERYDATE))-(DATEDIFF(wk, PURCHTABLE.CONFIRMEDDLV, MAX(VENDPACKINGSLIPJOUR.DELIVERYDATE)) * 2)-(CASE WHEN DATENAME(dw, PURCHTABLE.CONFIRMEDDLV) = 'Sunday' THEN 1 ELSE 0 END)-(CASE WHEN DATENAME(dw, MAX(VENDPACKINGSLIPJOUR.DELIVERYDATE)) = 'Saturday' THEN 1 ELSE 0 END) AS 'DAYS LATE'
    FROM
    PURCHTABLE
    JOIN 
    PURCHLINE ON PURCHLINE.PURCHID = PURCHTABLE.PURCHID
    JOIN
    VENDPACKINGSLIPJOUR ON VENDPACKINGSLIPJOUR.PURCHID = PURCHTABLE.PURCHID
    WHERE
    PURCHTABLE.DELIVERYDATE >= '2017-01-01'
    AND
    PURCHTABLE.DELIVERYDATE <= '2017-01-20'
    AND
    PURCHTABLE.ORDERACCOUNT = 'VN03526') A
GROUP BY  
PURCHTABLE.PURCHNAME, 
PURCHTABLE.ORDERACCOUNT,
PURCHTABLE.DELIVERYDATE,
PURCHTABLE.CONFIRMEDDLV

您目前擁有的代碼將成為較大查詢的一部分,例如:

select VendorID
      ,VendorName
      ...
      ...
      ,<Your Days Late Code> as DaysLate
      ,InvoiceAmount
      ...
from tables
group by VendorID
      ,VendorName

要對所有這些進行平均所需要做的就是選擇其他要進行平均的列,然后將整個內容包裝在另一個select語句中:

select VendorID
      ,VendorName
      ,avg(DaysLate) as AverageDaysLate
      ,sum(InvoiceAmount) as TotalInvoiceAmount
from(
    select VendorID
          ,VendorName
          ...
          ...
          ,<Your Days Late Code> as DaysLate
          ,InvoiceAmount
          ...
    from tables
    group by VendorID
            ,VendorName
) a
group by VendorID
        ,VendorName

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM