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 で、2 番目のテーブルは rpPay です

ここに画像の説明を入力

質問 - 期待される結果を得るにはどうすればよいですか?

4

3 に答える 3

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

提供したサンプルに基づいています。これを試して。要件とデータに基づいて少し変更する必要があります。

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

于 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,
    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 に答える