【问题标题】:Using Max with Date Values with or without the Nulls使用带或不带 Null 的日期值的 Max
【发布时间】:2016-12-17 13:55:42
【问题描述】:

现在,经过这么多小时试图解决这个问题,我现在真的需要帮助。

我有一张表,其中包含大约 50,000 名客户的数百万条记录。每个客户至少有 2000 笔交易。

我想要一个表格,记录每位客户在网站上购买或出售商品的最新日期。

我试过了

'FOR PURCHASES
Update tblmycustomers
set LastBoughtdate = (Select ISNULL(Max(trndate), '01-Jan-1900') from tbltransactions where Type = 'PURCHASES')
from tbltransactions.AccountRef = tblmycustomers.AccountNo

它适用于有“PURCHASES”的记录,但对于那些没有 PURCHASES 的记录,它会保存另一个错误的日期

我希望它为每个没有购买的客户返回默认日期(“01-Jan-1900”),并为有购买的客户返回最大交易日期。

请帮帮我。

【问题讨论】:

  • 您的第一个问题是在您的用例中使用更新语句。使用选择查询进行测试,结果将是相同的,但没有理论头痛

标签: sql-server tsql


【解决方案1】:

试试这个:

UPDATE c
SET LastBoughtdate = ISNULL(Q.MaxBoughtDate, '1900-01-01')
FROM tblmycustomers c
    LEFT JOIN 
    (SELECT AccountRef, MAX(trndate) AS MaxBoughtDate
    FROM tblTransactions
    WHERE Type = 'PURCHASES'
    GROUP BY AccountRef) Q ON Q.AccountRef = AccountNo

【讨论】:

  • 天门!完美的 !给了我几乎一天工作的东西。非常感谢 !你让我的一天变得轻松。
【解决方案2】:

我相信这会奏效。驱动程序表是“客户”,您希望加入交易......所以即使没有交易,您也可以获得所有客户记录。所以......做这样的事情:)

    Select cust.AccountNo
    ,      isnull(max(trans.trndate), convert(date,'01/01/1900')) as LastBoughtDate
    from tblmycustomers as cust
    left join tbltransactions as trans on cust.AccountNo = trans.AccountRef
    where type = 'PURCHASES' 
    group by cust.AccountNo

【讨论】:

  • 这将跳过更新所有帐户而不进行任何购买。如果您指定“where type = purchase”,则“left join”与“inner join”相同。
  • 好点......我有一个编辑,但我喜欢你的回答......几乎是我想要的:)
【解决方案3】:

此更新基于帐号的左外连接子查询的最大转换日期。

UPDATE 
    T
SET 
    T.LastBoughtdate=COALESCE(A.LastPurchaseDate,'01/01/1900')
FROM
    tblmycustomers T
LEFT OUTER JOIN
(
    SELECT
        T2.AccountRef
        LastPurchaseDate=MAX(trndate)
    FROM
        tbltransactions T2
    WHERE
        T2.Type='PURCHASES'
    GROUP BY
        T2.AccountRef
)AS A ON A.AccountRef=T.AccountNo

【讨论】:

  • 这将跳过更新所有没有任何购买的帐户,因为子查询只包含购买的行
  • 新版本在顶部缺少 ISNULL()。否则,对于所有未购买的帐户,LastBoughtDate 将为 NULL。所以最后它将与我的答案中的代码几乎相同:) COALESCE 可能不是必需的,因为 trndate 可能不能为 NULL。如果交易的交易日期为空,这是一个错误。
  • 我有一个 INNER JOIN 在破解查询后将无法工作。但是,在我修复它之后,我仍然没有让你知道“错过 ISNULL() 顶部”。问题的症结在于“LastUpdated”应该是最小日期或者如果为空则为其他值,否则为值。不是这样吗?
  • 不,您的子查询仅返回至少有一次购买的帐户。因此,如果客户没有任何购买,A.LastPurchaseDate 将为 NULL。如果客户没有购买,则需要将日期设置为默认日期 1900-01-01,因此您需要添加 ISNULL(...)
  • COALESCE(NULL,'01-Jan-1900') 返回 -->'01-Jan-1900'
【解决方案4】:

如果您的“LastBoughtdate”是 DateTime。我认为您需要转换“01-01-1900”。转换(日期,'01-01-1900',101)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    相关资源
    最近更新 更多