Sql 返回每个常用组的最新日期
使用SQL Server 2005/2008和此查询:Sql 返回每个常用组的最新日期,sql,sql-server-2008,sql-server-2005,Sql,Sql Server 2008,Sql Server 2005,使用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
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
情况。此查询返回每个商店的总金额和总金额。除此之外,我现在需要添加的是显示的存储中发生的最后一个事务。由于日期范围介于2012年1月1日和2013年1月1日之间,因此在Store 2中发生的最后一笔交易就是预期结果中的交易。商店1在另一时间进行了最后一笔交易
第一个表是RPTR,第二个表是rpPay
问题-我如何获得预期结果
根据你提供的样品。试试这个。您需要根据您的需求和数据对其进行一些修改
我能解决问题的一半
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
声明@FromDate DATETIME,@Todate DATETIME
设置@FromDate='1/1/2012'
设置@Todate='1/1/2013'
挑选
当(分组(s.storeid)=1)然后“总计”其他s.storeid结束为Store时,
已支付的铸造(金额(p.金额)为十进制(12,2)),
当(分组(s.StoreID)=1)然后null ELSE CAST(MAX(s.TRSDate)作为日期时间)作为LastTransaction结束时的情况
从…起
RPTS,RPP
哪里
s、 接收编号=p.接收编号和
s、 StoreID=p.StoreID和
s、 TRSDate>=@FromDate和
s、 TRSDate对我有效的最终答案:
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
如果你的范围是从2012年1月1日到2013年1月1日,那么为什么2013年3月6日(或者是6月3日?)会再次出现?难道你不会只期待2012年的数据吗?如果你展示一些样本数据,让我们知道这些结果是如何得出的,它可能会给我们足够的信息来编写更好的查询。很难解决这个问题,因为我们知道你尝试了什么,得到了什么,但不知道它来自哪里。@AaronBertrand-在“问题”之前检查更新的文本@AaronBertrand-使用表中的样本数据更新post与我得到的结果完全相同。如果您可以发布一些样本数据,这将非常有用。在语句尝试时,将“”而不是null放在您的case上,它返回1900-01-01 00:00:00.000
ISNULL(case when(GROUPING(s.StoreID)=1),然后将null ELSE转换为(MAX(s.TRSDate)as DATETIME)END',)由于LastTransactionStill返回的是1900-01-01 00:00:00.000
,而您的另一个答案很好,只是它必须有一个日期为空的总数
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
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