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

我得到这个输出:

在此处输入图像描述

它为 Store 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

在此处输入图像描述

问题 - 我如何获得预期的结果?

4

3 回答 3

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 小提琴演示

于 2013-03-08T21:54:19.303 回答
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

这使 :

在此处输入图像描述

现在,如何将NULL哪个显示DATETIME为空白?

于 2013-03-08T22:19:17.383 回答
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
于 2013-03-08T22:44:35.380 回答