SQL - 为表中的每个货币代码(在两个定义的日期之间)创建一个具有唯一日期和货币记录的表

Posted

技术标签:

【中文标题】SQL - 为表中的每个货币代码(在两个定义的日期之间)创建一个具有唯一日期和货币记录的表【英文标题】:SQL - Create a table with unique date & currency records for every currency code in a table (between two defined dates) 【发布时间】:2021-04-01 19:33:02 【问题描述】:

所以我有一个包含约 40 条记录的货币代码表和一个生成两天之间日期列表的查询。 (我也有一张桌子,但我认为这样可以)

我们的目标是创建一个包含货币和日期的每种组合的表格。因此,如果有 4 种货币和 10 天,那么每种组合将有 400 条记录。

感谢您的任何见解!

PK Currency
1 USD
2 EUR
3 CAD
4 KRW
5 CNY
6 JPY
7 GBP
8 PLN
9 NZD
... ...
    DECLARE @StartDateTime DATETIME
    DECLARE @EndDateTime DATETIME
    
    SET @StartDateTime = Getdate()-15
    SET @EndDateTime = Getdate()-1
    
    
    ;WITH DateRange(DateData) AS 
    (
        SELECT @StartDateTime as Date
        UNION ALL
        SELECT DATEADD(d,1,DateData)
        FROM DateRange 
        WHERE DateData < @EndDateTime
    )
    SELECT CAST(DateData as Date)
    FROM DateRange

【问题讨论】:

【参考方案1】:

交叉连接就是你想要的。

WITH DateRange(DateData) AS 
(
    SELECT @StartDateTime as Date
    UNION ALL
    SELECT DATEADD(d,1,DateData)
    FROM DateRange 
    WHERE DateData < @EndDateTime
)
SELECT DateData, Currency 
FROM DateRange
CROSS JOIN CurrencyTableName

如果一列已经是日期类型,则不必将其强制转换为日期

【讨论】:

太棒了,它就在我的眼皮底下……DECLARE @StartDateTime DATETIME DECLARE @EndDateTime DATETIME SET @StartDateTime Getdate()-15 SET @EndDateTime = Getdate()-1 ;WITH DateRange(DateData) AS ( SELECT @StartDateTime as Date UNION ALL SELECT DATEADD(d,1,DateData) FROM DateRange WHERE DateData &lt; @EndDateTime ) Select * from DateRange CROSS JOIN CURRENCIES @charleface 和任何关心的人——并非所有平台都需要 CROSS JOIN 关键字。

以上是关于SQL - 为表中的每个货币代码(在两个定义的日期之间)创建一个具有唯一日期和货币记录的表的主要内容,如果未能解决你的问题,请参考以下文章

Sql 查询为表中的每个组合返回一条记录

sql 为表中的每一行创建哈希码。

MS Access:为表中的每个条目生成报告

SQL查询将列值显示为表中的列名

使用 SQL Server Management Studio 为表中的前 100 个值创建脚本

MS SQL 为表中的字段添加/修改说明