2009-10-14 114 views
0

我想要執行一個閾值查詢,其中一個將從今天獲取一個字段的值,並將其與昨天的值進行比較,此查詢看起來像這樣,但顯然,它是錯誤的,我無法找到如何做到這一點:幫助一個SQL查詢

select 
    TableB.Name, 
    TableA.Charge, 
    ( 
    select Charge 
    from TableA 
    where (DateAdded >= '13/10/2009' and DateAdded < '14/10/2009') 
    ) 
    from TableA 

inner join 
    TableB on TableB.ID = TableA.ID 

where 
    TableA.DateAdded >= '10/14/2009' 

order by 
    Name asc 

只是一個快速的筆記,我找了兩個CHARGE領域,而不是日期。日期操作僅適用於今天和昨天,僅此而已。

最後,我想對兩個返回的電荷字段進行計算,所以如果它更容易顯示,那也會很好。

在此先感謝

凱爾

EDIT1:

我找的數據是,像這樣:

昨天,我們輸入一個收費500至MACHINEA 今天我們輸入收取300給MachineA

我們運行查詢,結果我需要如下:

Name = MachineA 
Charge = 300 
YesterdayCharge = 500 

回答

0

如果你真的需要一個日期(包括週末等),那麼下面的查詢應該做的工作。否則,請張貼的數據樣本和預期的結果:

SELECT  TableB.Name, 
      TableA.Charge, 
      prev.Charge AS PrevCharge 
FROM  TableA 
INNER JOIN TableB 
     ON TableA.ID = TableB.ID 
LEFT JOIN TableA prev 
     ON TableA.ID = prev.ID 
     --// use this if DateAdded contains only date 
     --AND TableA.DateAdded = DATEADD(day, +1, prev.dateAdded) 
     --// use this if DateAdded contains also time component 
     AND CONVERT(DATETIME, CONVERT(CHAR(8), TableA.DateAdded, 112), 112) = DATEADD(day, +1, CONVERT(DATETIME, CONVERT(CHAR(8), prev.dateAdded, 112), 112)) 

編輯1:在JOIN的情況下,當DateAdded包含時間,以及增加選項

+0

這是我正在查找的類型,只是我爲PrevCharge字段獲得了NULL。儘管我會用數據樣本更新這個問題。 – 2009-10-14 07:06:11

+0

你可以發佈DateAdded字段中的值的樣本嗎?我想確定一下,如果你有日期還是有時間分量?因爲如果你有時間的話,那麼顯然以前發生的事情不太可能發生在同一時間。另外,您確定每天每個ID只有一個條目嗎? – van 2009-10-14 10:50:41

+0

用另一個JOIN子句更新查詢來處理時間組件 – van 2009-10-14 10:56:18

0

這樣的事情?

SELECT 
    B.Name, 
    A.Charge, 
    DATEPART(day, A.DateAdded) as day 
FROM 
    TableA A, Table B 
WHERE 
    B.ID = A.ID AND 
    A.DateAdded BETWEEN DATEADD(day, -1, GETDATE()) AND GETDATE() 
GROUP BY 
    B.Name, 
    A.Charge, 
    A.DateAdded 
+0

我收到一個錯誤:使用UNION,INTERSECT或EXCEPT運算符組合的所有查詢在其目標列表中必須具有相同數量的表達式。 – 2009-10-14 06:49:05

+0

您將以每天一個ROW結束 – balexandre 2009-10-14 06:57:23

0

試試這個:

DECLARE @ValuesTable TABLE(Name VARCHAR(20), Charge INT, DateAdded DATETIME) 

INSERT INTO @ValuesTable 
SELECT 'Name1', 10, DATEADD(dd, 2, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name2', 20, DATEADD(dd, 2, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name1', 30, DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name2', 40, DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name1', 50, DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name2', 60, DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name1', 70, DATEADD(dd, -1, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name3', 80, DATEADD(dd, -1, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name1', 90, DATEADD(dd, -2, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name2', 100, DATEADD(dd, -2, DATEDIFF(dd, 0, GETDATE())) 


SELECT 
ISNULL(T.Name,Y.Name) AS Name, 
SUM(ISNULL(Y.Charge,0)) AS Yesterday, SUM(ISNULL(T.Charge,0)) AS Today, 
SUM(ISNULL(T.Charge,0)) - SUM(ISNULL(Y.Charge,0)) AS Diff 
FROM(
    SELECT Name, Charge 
    FROM @ValuesTable 
    WHERE DateAdded BETWEEN DATEADD(day, -2, GETDATE()) 
     AND DATEADD(day, -1, GETDATE()) 
) AS Y 
FULL JOIN(
    SELECT Name, Charge 
    FROM @ValuesTable 
    WHERE DateAdded BETWEEN DATEADD(day, -1, GETDATE()) AND GETDATE() 
) AS T ON ISNULL(T.Name,Y.Name) = ISNULL(Y.Name,T.Name) 
GROUP BY ISNULL(T.Name,Y.Name) , ISNULL(Y.Name,T.Name) 
0

這可能只是SO而是一個錯字如果您在同一查詢中使用日期字符串'14/10/2009'和'10/14/2009',則它將無法工作。 無論您使用哪種日期格式,其中有太多的月份。

+0

是的,只是一個錯字:) – 2009-10-14 11:30:25