【问题标题】:I need to find the RECENT,MAX, SUM as dataset values joining two tables in one select query我需要在一个选择查询中找到 RECENT、MAX、SUM 作为数据集值加入两个表
【发布时间】:2011-02-04 01:21:44
【问题描述】:

我有两个表“收据表:”和“人员表:”
我需要找到这些值的结果集 SUM 金额,截至今天支付的 MAXIMUM amt,截至今天 MAXIMUM amtpaid_DATE, RECENT amt pay for today, RECENT amt paid_DATE 截至今天。

下面是 Tabluler 格式。

收据表:

ReceiptID   Receipt_Date    AmountPaid  PersonID
R001    1/1/2011    $50     P003
R002    1/2/2011    $20.20  P001
R003    1/2/2011    $35     P005
R004    1/4/2011    $17     P002
R005    1/10/2011   $89.20  P003
R006    1/11/2011   $10     P001
R007    1/11/2011   $9.15   P007
R008    1/12/2011   $5.45   P002
R009    1/20/2011   $65     P006
R010    1/23/2011   $20     P004
R011    1/29/2011   $10     P003

人表:

PersonID    PersonName
P001    A_person
P002    B_person
P003    C_person
P004    D_person
P005    E_person
P006    F_person
P007    G_person
P008    H_person

输出结果:

PersonID    PersonName  Sum(Amtpaid)    RECENT(AmountPaid)  RECENT(Amtpaid_ReceiptDate) Max (Amt Receipt_paid as of today)  Max (amt receipt paid Date as of today)
P001    A_Person    $30.20  $10     1/11/2011   $20.20  1/2/2011
P002    B_person    $22.45  $5.45   1/12/2011   $17     1/4/2011
P003    C_person    $149.20     $10     1/29/2011   $89.20  1/10/2011
P004    D_person    $20     $20     1/23/2011   $20     1/23/2011
P005    E_person    $35     $35     1/2/2011    $35     1/2/2011
P006    F_person    $65     $65     1/20/2011   $65     1/20/2011
P007    G_person    $9.15   $9.15   1/11/2011   $9.15   1/11/2011

【问题讨论】:

  • 你如何定义“最近”?

标签: sql-server sql-server-2005 tsql sql-server-2008


【解决方案1】:

我不在可以测试此代码的计算机上,但也许您可以试试这个:

;WITH Receipts AS
(
    SELECT  *, 
            SUM(AmountPaid) OVER(PARTITION BY PersonID) SumAmount, 
            MAX(AmountPaid) OVER(PARTITION BY PersonID) MaxAmount,
            MAX(Receipt_Date) OVER(PARTITION BY PersonID) RecentPaidDate
    FROM ReceiptTable
)

SELECT  P.PersonId, P.PersonName, 
        MIN(SumAmount) SumAmount,
        MIN(CASE WHEN Receipt_Date = RecentPaidDate THEN AmountPaid END) RecentAmountPaid,
        MIN(RecentPaidDate) RecentPaidDate,
        MIN(MaxAmount) MaxAmount,
        MIN(CASE WHEN AmountPaid = MaxAmount THEN Receipt_Date END) MaxAmountReceiptDate
FROM PersonTable P
JOIN Receipts R
ON R.PersonId = P.PersonID
GROUP BY P.PersonId, P.PersonName

无论如何,如果您之前使用该代码,您应该知道它返回MINReceiptDate,以防重复MaxAmountPaid(意味着它有2条相同金额的记录和MaxAmountPaid)。

【讨论】:

  • 嗨 Eric Petroelje “最近”我的意思是每人付款中最新/新的 ID
  • 嗨 Lamak,您的回答非常好。我想要的结果集是准确的。你真是个知识分子,你解决了我在没有电脑的情况下如此快速地得到答案的困难。我只是稍微做了一些修改以获取“MaxAmountReceiptDAte”的 MAX 并按 personID、personNAme 分组
  • @desi 不客气。你说得对,我完全忘记了 GROUP BY。很高兴你能成功
【解决方案2】:

类似...

select 
p.PersonID,
p.PersonName,
sum(AmountPaid),
(select top 1 AmountPaid from RECEIPT where PersonID = p.PersonID Order By Receipt_Date Desc) AS recentPaidAmt,
(select top 1 Receipt_Date from RECEIPT where PersonID = p.PersonID Order By Receipt_Date Desc) AS recentPaidDate,
(select top 1 AmountPaid from RECEIPT where PersonID = p.PersonID Order By AmountPaid Desc) AS maxRecentPaidAmt,
(select top 1 Receipt_Date from RECEIPT where PersonID = p.PersonID Order By AmountPaid Desc) AS maxRecentPaidDate
from RECEIPT r, PERSON p 
where p.PersonID = r.PersonID
group by p.PersonID

【讨论】:

  • 嗨 John K,感谢您的回答,但我得到的总和(支付的金额)翻了一番,例如 - 'P001' 如果我运行查询,我得到的总和为 '$60.40' 这应该是“30.20 美元”
  • 我离开了 group by 声明。
【解决方案3】:

试试这个:

Select personId, PersonName,
    Sum(r.amountPaid) TotalPaid,
    Max(m.amountPaid) MaxPaid,
    Max(m.Receipt_Date) MaxpaidDate,
    Max(x.amountPaid) recentPaid,
    Max(x.Receipt_Date) recentPaidDate

From Person p
   Left Join receipt r on r.PersonId = p.personId
   Left join receipt x 
       On x.personId = p.personId
           And x.Receipt_Date  =
              (Select Max(Receipt_Date)
               From Receipt
               Where personId = x.PersonId)
   Left join receipt m 
       On m.ReceiptId = 
         (Select Max(ReceiptId)
          From Receipt
           Where personId = m.PersonId 
              And amountPaid = 
                 (Select Max(amountPaid)
                  From Receipt
                  Where personId = m.PersonId))
Group By personId, PersonName

【讨论】:

  • 嗨,Charles Bretana,非常感谢您的回答,但如果我运行查询,在某些情况下,我会得到 sum amt double 的“P001”,我得到 sum amt 为“$60.40”,这应该是“30.20 美元”
  • ahhh 可能有多个记录具有相同的最大数量,导致笛卡尔积(行数增加一倍或三倍)我会解决这个问题...
猜你喜欢
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 2017-04-30
相关资源
最近更新 更多