Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL转换结果_Sql Server 2008 - Fatal编程技术网

Sql server 2008 SQL转换结果

Sql server 2008 SQL转换结果,sql-server-2008,Sql Server 2008,我有这样的数据库数据 输入 我需要像这样使用sql查询来转换这些数据 输出 Id | Month | Value 1 1/2/2010 20 1 1/3/2010 20 1 1/4/2010 20 1 1/5/2010 20 1 1/6/2010 20 2 1/5/2010 80 2 1/6/2010

我有这样的数据库数据

输入

我需要像这样使用sql查询来转换这些数据

输出

Id  |   Month       |   Value
1       1/2/2010        20
1       1/3/2010        20
1       1/4/2010        20
1       1/5/2010        20
1       1/6/2010        20
2       1/5/2010        80
2       1/6/2010        80
2       1/7/2010        80

请建议可能的解决方案。考虑性能,因为输入表有数百万条记录,我们需要处理所有的记录。我使用的是SQL 2008,希望避免循环或游标。谢谢。

然后看看如何使用递归CTE查询

差不多

DECLARE @Table TABLE(
    Id INT,
    StartDate DATETIME,
    EndDate DATETIME,
    Value FLOAT
)

INSERT INTO @Table SELECT 1,'1/2/2010','1/6/2010',20
INSERT INTO @Table SELECT 2,'1/5/2010','1/7/2010',80

;WITH Vals AS (
        SELECT  id,
                StartDate,
                EndDate,
                Value
        FROM    @Table
        UNION   ALL
        SELECT  id,
                StartDate + 1,
                EndDate,
                Value
        FROM    Vals
        WHERE   StartDate + 1 <= EndDate
)
SELECT  *
FROM    Vals
ORDER BY    id,
            StartDate
OPTION (MAXRECURSION 0)

然后看看如何使用递归CTE查询

差不多

DECLARE @Table TABLE(
    Id INT,
    StartDate DATETIME,
    EndDate DATETIME,
    Value FLOAT
)

INSERT INTO @Table SELECT 1,'1/2/2010','1/6/2010',20
INSERT INTO @Table SELECT 2,'1/5/2010','1/7/2010',80

;WITH Vals AS (
        SELECT  id,
                StartDate,
                EndDate,
                Value
        FROM    @Table
        UNION   ALL
        SELECT  id,
                StartDate + 1,
                EndDate,
                Value
        FROM    Vals
        WHERE   StartDate + 1 <= EndDate
)
SELECT  *
FROM    Vals
ORDER BY    id,
            StartDate
OPTION (MAXRECURSION 0)

创建助手表Beta:

 CREATE TABLE Beta (
 Monat DATETIME,
 )
填写您需要的所有月份:

 INSERT INTO Beta VALUES( '1/1/2010' )
 ...
 INSERT INTO Beta VALUES( '1/12/2010' )  ' maybe '12/1/2010' 
以及:

无花环的wrt性能

我没有料到这样的事情需要“证明”——

    ===============================================================================
    SO5192555 - select for hungryMind
    -------------------------------------------------------------------------------
    -------------------------------------------------------------------------------
    SELECT * FROM Alpha
    -------------------------------------------------------------------------------
    |Id|StartDate|EndDate |Value|
    | 1| 2/1/2010|6/1/2010|   20|
    | 2| 5/1/2010|7/1/2010|   80|
    -------------------------------------------------------------------------------
    -------------------------------------------------------------------------------
    SELECT A.Id, B.Monat, A.Value FROM  Alpha A, Beta B WHERE B.Monat >= A.StartDate And B.Monat <= A.EndDate
    -------------------------------------------------------------------------------
    |Id|Monat   |Value|
    | 1|2/1/2010|   20|
    | 1|3/1/2010|   20|
    | 1|4/1/2010|   20|
    | 1|5/1/2010|   20|
    | 1|6/1/2010|   20|
    | 2|5/1/2010|   80|
    | 2|6/1/2010|   80|
    | 2|7/1/2010|   80|
    ===============================================================================
    xpladolib.vbs: Erfolgreich beendet. (0) [ 0.17969 secs ]     

创建助手表Beta:

 CREATE TABLE Beta (
 Monat DATETIME,
 )
填写您需要的所有月份:

 INSERT INTO Beta VALUES( '1/1/2010' )
 ...
 INSERT INTO Beta VALUES( '1/12/2010' )  ' maybe '12/1/2010' 
以及:

无花环的wrt性能

我没有料到这样的事情需要“证明”——

    ===============================================================================
    SO5192555 - select for hungryMind
    -------------------------------------------------------------------------------
    -------------------------------------------------------------------------------
    SELECT * FROM Alpha
    -------------------------------------------------------------------------------
    |Id|StartDate|EndDate |Value|
    | 1| 2/1/2010|6/1/2010|   20|
    | 2| 5/1/2010|7/1/2010|   80|
    -------------------------------------------------------------------------------
    -------------------------------------------------------------------------------
    SELECT A.Id, B.Monat, A.Value FROM  Alpha A, Beta B WHERE B.Monat >= A.StartDate And B.Monat <= A.EndDate
    -------------------------------------------------------------------------------
    |Id|Monat   |Value|
    | 1|2/1/2010|   20|
    | 1|3/1/2010|   20|
    | 1|4/1/2010|   20|
    | 1|5/1/2010|   20|
    | 1|6/1/2010|   20|
    | 2|5/1/2010|   80|
    | 2|6/1/2010|   80|
    | 2|7/1/2010|   80|
    ===============================================================================
    xpladolib.vbs: Erfolgreich beendet. (0) [ 0.17969 secs ]     

尽管饥民的我不能,而且看起来,我仍然认为使用助手 桌子是正确的选择:

用50000条记录填充表Alpha,如

SELECT TOP 5 *, DATEDIFF("d", StartDate, EndDate ) + 1 AS Days FROM Alpha ORDER BY Id
-------------------------------------------------------------------------------
|Id|StartDate |EndDate   |Value|Days|
| 1| 12/6/2001| 5/15/2002|   10| 161|
| 2| 8/2/2001 |10/27/2001|   20|  87|
| 3|10/28/2000| 6/17/2001|   30| 233|
| 4| 1/15/2000| 8/30/2000|   40| 229|
| 5| 3/25/2002|10/23/2002|   50| 213|
-------------------------------------------------------------------------------
SELECT TOP 5 *, DATEDIFF("d", StartDate, EndDate ) + 1 AS Days FROM Alpha ORDER BY Id DESC
-------------------------------------------------------------------------------
|Id   |StartDate |EndDate   |Value |Days|
|50000|10/31/2001| 5/6/2002 |500000| 188|
|49999| 8/31/2002|12/31/2002|499990| 123|
|49998| 4/11/2002|11/11/2002|499980| 215|
|49997| 3/13/2002|12/16/2002|499970| 279|
|49996| 7/4/2002 | 7/27/2002|499960|  24|
并根据范围MIN StartDate创建助手表Beta。。。 MAX EndDate-我使用循环插入所有1297天-

-----------------------------------------------
SELECT TOP 5 * FROM Beta ORDER BY Monat
-----------------------------------------------
|Monat   |
|1/1/2000|
|1/2/2000|
|1/3/2000|
|1/4/2000|
|1/5/2000|
-----------------------------------------------
SELECT TOP 5 * FROM Beta ORDER BY Monat DESC
-----------------------------------------------
|Monat    |
|7/20/2003|
|7/19/2003|
|7/18/2003|
|7/17/2003|
|7/16/2003|
执行

SELECT A.Id, B.Monat, A.Value
INTO Gamma FROM  Alpha A, Beta B
WHERE B.Monat >= A.StartDate And B.Monat <= A.E
要将7.522.243记录插入Gamma表,请执行以下操作:

SELECT TOP 5 * FROM Gamma Order BY Id, Monat
-----------------------------------------------------------
|Id|Monat     |Value|
| 1| 12/6/2001|   10|   <--- | 1| 12/6/2001| 5/15/2002|   10| 161|
| 1| 12/7/2001|   10|
| 1| 12/8/2001|   10|
| 1| 12/9/2001|   10|
| 1|12/10/2001|   10|
-----------------------------------------------------------
SELECT TOP 5 * FROM Gamma Order BY Id DESC, Monat
-----------------------------------------------------------
|Id   |Monat     |Value |
|50000|10/31/2001|500000| <---- |50000|10/31/2001| 5/6/2002 |500000| 188|
|50000| 11/1/2001|500000|
|50000| 11/2/2001|500000|
|50000| 11/3/2001|500000|
|50000| 11/4/2001|500000|
在我的WinXP/SQLExpress/1 GB Mem/VirtualBox机器上花了大约2分钟。做 仅选择进入就花了26秒

50000条源记录少于113000条或“数百万条”,但我做了测试
通过VBScript使用ADO/OleDB。当然,MS服务器管理员可以做得更好。

尽管hungryMind的我做不到,而且看起来,我仍然认为使用helper 桌子是正确的选择:

用50000条记录填充表Alpha,如

SELECT TOP 5 *, DATEDIFF("d", StartDate, EndDate ) + 1 AS Days FROM Alpha ORDER BY Id
-------------------------------------------------------------------------------
|Id|StartDate |EndDate   |Value|Days|
| 1| 12/6/2001| 5/15/2002|   10| 161|
| 2| 8/2/2001 |10/27/2001|   20|  87|
| 3|10/28/2000| 6/17/2001|   30| 233|
| 4| 1/15/2000| 8/30/2000|   40| 229|
| 5| 3/25/2002|10/23/2002|   50| 213|
-------------------------------------------------------------------------------
SELECT TOP 5 *, DATEDIFF("d", StartDate, EndDate ) + 1 AS Days FROM Alpha ORDER BY Id DESC
-------------------------------------------------------------------------------
|Id   |StartDate |EndDate   |Value |Days|
|50000|10/31/2001| 5/6/2002 |500000| 188|
|49999| 8/31/2002|12/31/2002|499990| 123|
|49998| 4/11/2002|11/11/2002|499980| 215|
|49997| 3/13/2002|12/16/2002|499970| 279|
|49996| 7/4/2002 | 7/27/2002|499960|  24|
并根据范围MIN StartDate创建助手表Beta。。。 MAX EndDate-我使用循环插入所有1297天-

-----------------------------------------------
SELECT TOP 5 * FROM Beta ORDER BY Monat
-----------------------------------------------
|Monat   |
|1/1/2000|
|1/2/2000|
|1/3/2000|
|1/4/2000|
|1/5/2000|
-----------------------------------------------
SELECT TOP 5 * FROM Beta ORDER BY Monat DESC
-----------------------------------------------
|Monat    |
|7/20/2003|
|7/19/2003|
|7/18/2003|
|7/17/2003|
|7/16/2003|
执行

SELECT A.Id, B.Monat, A.Value
INTO Gamma FROM  Alpha A, Beta B
WHERE B.Monat >= A.StartDate And B.Monat <= A.E
要将7.522.243记录插入Gamma表,请执行以下操作:

SELECT TOP 5 * FROM Gamma Order BY Id, Monat
-----------------------------------------------------------
|Id|Monat     |Value|
| 1| 12/6/2001|   10|   <--- | 1| 12/6/2001| 5/15/2002|   10| 161|
| 1| 12/7/2001|   10|
| 1| 12/8/2001|   10|
| 1| 12/9/2001|   10|
| 1|12/10/2001|   10|
-----------------------------------------------------------
SELECT TOP 5 * FROM Gamma Order BY Id DESC, Monat
-----------------------------------------------------------
|Id   |Monat     |Value |
|50000|10/31/2001|500000| <---- |50000|10/31/2001| 5/6/2002 |500000| 188|
|50000| 11/1/2001|500000|
|50000| 11/2/2001|500000|
|50000| 11/3/2001|500000|
|50000| 11/4/2001|500000|
在我的WinXP/SQLExpress/1 GB Mem/VirtualBox机器上花了大约2分钟。做 仅选择进入就花了26秒

50000条源记录少于113000条或“数百万条”,但我做了测试
通过VBScript使用ADO/OleDB。当然,MS Server管理员可以做得更好。

完美,但性能非常差。我有11.3万张唱片,半小时内就达到了目前为止的11000张唱片。我在CLR集成项目中有另一个解决方案,它更好,但不可接受。性能是我寻找其他选择的首要考虑因素。很好,但性能非常差。我有11.3万张唱片,半小时内就达到了目前为止的11000张唱片。我在CLR集成项目中有另一个解决方案,它更好,但不可接受。性能是我寻找其他选项的主要考虑因素。不,我的所有行都有不同的开始和结束日期。我无法创建beta表。我有大约一百万行,我将它们分组以获得最大和最小日期并插入表beta,并对联接执行查询,似乎不会提供更好的性能。不,我所有的行都有不同的开始和结束日期。我无法创建表beta。我有大约一百万行,我将它们分组以获得最大和最小日期,并插入到表beta中,并对join执行查询,似乎不会提供更好的性能。我也将尝试这种方法。无论如何,谢谢。我也会尝试这种方法。无论如何,谢谢你。