2013-03-08 67 views
0

最新日期使用SQL Server 2005/2008與此查詢:返回每普通組

DECLARE @FromDate DATETIME, @Todate DATETIME 

SET @FromDate = '1/1/2012' 
SET @Todate = '1/1/2013' 

SELECT 
    CASE WHEN (GROUPING(s.storeid)=1) THEN 'Total' ELSE s.storeid END AS Store, 
    CAST(SUM(p.amount) AS DECIMAL(12,2)) AS Paid, 
    CAST((SELECT 
      TOP 1 s.TRSDate 
     FROM 
      RPTrs s, 
      rpPay p 
     WHERE 
      s.StoreID = p.StoreID AND 
      s.ReceiptNO = p.ReceiptNo 
     ORDER BY 
      s.TRSDate DESC) AS DATETIME) AS LastTransaction 
FROM 
    rptrs s, rppay p 
WHERE 
    s.ReceiptNO = p.ReceiptNo AND 
    s.StoreID = p.StoreID AND 
    s.TRSDate >= @FromDate AND 
    s.TRSDate <= @Todate 
GROUP BY 
    s.StoreID 
WITH ROLLUP 

我得到這樣的輸出:

enter image description here

它添加了正確的日期爲01店但不是Store 02,我希望Total線路沒有任何內容。

預期結果:

| Store | Paid  | LastTransaction 
----------------------------------------------- 
1 | 01 | 59490.05 | 2013-03-06 00:00:00.000 
2 | 02 | 238.15 | 2012-12-03 00:00:00.000 
3 | Total | 59728.20 | 

情況。該查詢返回每個商店的總金額和總金額。除此之外,我現在需要添加的是顯示的商店中發生的最後一筆交易。由於日期範圍介於2012年1月1日至2013年1月1日之間,因此商店2中發生的最後一筆交易是預期結果中的交易。商店1在另一時間進行了最後的交易。

第一個表是RPTrs,第二個是rpPay

enter image description here

問題 - 如何得到預期的結果?

+0

如果你的範圍是從1/1/2012 - > 2013年1月1日,這是爲什麼3月6日(或者是6月3日?)2013即將到來回到結果?難道你不希望從2012年的數據? – 2013-03-08 21:47:49

+0

另外,如果您顯示一些示例數據,以便我們知道這些結果是如何派生的,則可能會爲我們提供足夠的信息來編寫更好的查詢。我們很難解決這個問題,因爲我們知道你所嘗試的是什麼,你得到了什麼,但不知道它來自哪裏。 – 2013-03-08 21:48:51

+0

@AaronBertrand - 更新後從表樣本數據 – JohnZ 2013-03-08 21:52:10

回答

0

最終的答案已經爲我工作:

DECLARE @FromDate DATETIME, @Todate DATETIME 

SET @FromDate = '1/1/2012' 
SET @Todate = '1/1/2013' 

SELECT 
    CASE WHEN (GROUPING(s.storeid)=1) THEN 'Total' ELSE s.storeid END AS Store, 
    CAST(SUM(p.amount) AS DECIMAL(12,2)) AS Paid, 
    ISNULL(CONVERT(VARCHAR(50),(CASE WHEN (GROUPING(s.StoreID)=1) THEN null ELSE CAST(MAX(s.TRSDate) AS DATETIME) END)), '')AS LastTransaction 
FROM 
    rptrs s, rppay p 
WHERE 
    s.ReceiptNO = p.ReceiptNo AND 
    s.StoreID = p.StoreID 
GROUP BY 
    s.StoreID 
WITH ROLLUP 
0

根據您提供的樣本。嘗試這個。您需要根據您的要求和數據稍微修改一下。

SELECT R.StoreID, 
     CAST(SUM(p.amount) AS DECIMAL(12,2)) AS Paid, 
     MAX(TRSDate) 
FROM RPTrs R 
INNER JOIN rpPay p ON R.StoreID = P.StoreID 
GROUP BY R.StoreID 

SQL FIDDLE DEMO

+0

完全相同的結果,因爲我有 – JohnZ 2013-03-08 21:55:08

+0

這將是有益的,如果你可以張貼一些示例數據 - 之前的「問題」 – 2013-03-08 21:56:55

+0

表格示例發佈 – JohnZ 2013-03-08 22:00:35

0

我能夠做的解決我的問題的一個半部分。

DECLARE @FromDate DATETIME, @Todate DATETIME 

SET @FromDate = '1/1/2012' 
SET @Todate = '1/1/2013' 

SELECT 
    CASE WHEN (GROUPING(s.storeid)=1) THEN 'Total' ELSE s.storeid END AS Store, 
    CAST(SUM(p.amount) AS DECIMAL(12,2)) AS Paid, 
    CASE WHEN (GROUPING(s.StoreID)=1) THEN null ELSE CAST(MAX(s.TRSDate) AS DATETIME) END AS LastTransaction 
FROM 
    rptrs s, rppay p 
WHERE 
    s.ReceiptNO = p.ReceiptNo AND 
    s.StoreID = p.StoreID AND 
    s.TRSDate >= @FromDate AND 
    s.TRSDate <= @Todate 
GROUP BY 
    s.StoreID 
WITH ROLLUP 

其中給出:

enter image description here

現在,我該如何顯示NULL這是DATETIME爲空白空間?

+0

在您的情況下將「'替代爲空' – 2013-03-08 22:22:29

+0

嘗試,返回'1900-01-01 00:00:00.000' – JohnZ 2013-03-08 22:24:09

+0

ISNULL(CASE WHEN(GROUPING(s.StoreID)= 1)那麼null ELSE CAST(MAX(s。TRSDate)AS DATETIME)END,'')AS LastTransaction – 2013-03-08 22:27:13