【问题标题】:Break a single record into multiple将单个记录分成多个
【发布时间】:2012-11-06 22:18:41
【问题描述】:

通常情况相反,但我想通过 SQL 将单个记录分成多个记录。

我们存储具有开始和结束日期的范围,但需要导出范围中每一年的记录。

示例:TECH_ID 有一个 2009 年的 begin_date 和 2011 年的 end_date。我们需要导出 2009 年、2010 年和 2011 年的 3 条记录。

如何做到这一点?

【问题讨论】:

  • 您使用的是什么 RDBMS?您可以发布一些示例数据,然后发布所需的结果吗?
  • 从 ODBC 中提取并导出为 CSV 以进行 FTP 上传。

标签: sql gaps-and-islands


【解决方案1】:

You require a numbers table:

CREATE TABLE Numbers
(
    Number INT NOT NULL,
    CONSTRAINT PK_Numbers 
        PRIMARY KEY CLUSTERED (Number)
        WITH FILLFACTOR = 100
)

INSERT INTO Numbers
SELECT
    (a.Number * 256) + b.Number AS Number
FROM 
    (
        SELECT number
        FROM master..spt_values
        WHERE 
            type = 'P'
            AND number <= 255
    ) a (Number),
    (
        SELECT number
        FROM master..spt_values
        WHERE 
            type = 'P'
            AND number <= 255
    ) b (Number)
GO

现在你有了一个数字表...

SELECT DISTINCT
    n.Number
FROM
    Numbers n 
    JOIN TECH_ID t 
        ON n.Number BETWEEN t.begin_date AND t.end_date

【讨论】:

  • 啊!正是我想要的!谢谢!
【解决方案2】:

创建一个每年有一行的表(一些 RDBMS 有快捷方式)。然后做

Select
  t.*,
  y.Year
From
  Years y
    Inner Join
  tech_id t
    On Year(t.begin_date) <= y.Year And Year(t.end_date) >= y.Year

【讨论】:

    【解决方案3】:

    当我阅读您的问题时,并未明确提及示例数据。顺便说一句,我写这个作为一个例子,根据你有什么把一个记录放在三个记录上。

    Select  *
        From    (
            Select  1   As  Id
            ,   'Test'  As  Name
        )   As  SampleRecord
        Cross   Join
            (
            Select  2009    As  Year
        Union   Select  2010
        Union   Select  2011
        )   As  Years
    

    干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 2020-11-06
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多