相关疑难解决方法(0)

返回连续日期的临时表

我需要创建一个返回连续日期表的函数.我会传递一个最小和最大日期.

我希望它可以这样调用:

SELECT * FROM GetDates('01/01/2009', '12/31/2009')
Run Code Online (Sandbox Code Playgroud)

我目前有一个存储过程执行此操作,但需求已更改,现在我需要包括从联合中返回的数据:

 with mycte as
(
     select cast(@minDate as datetime) DateValue
     union all
     select DateValue + 1
     from    mycte   
     where   DateValue + 1 <= @maxDate
 )
 select DateValue
 from    mycte
option (maxrecursion 1000)
Run Code Online (Sandbox Code Playgroud)

然而,问题是我需要将递归设置为大于100.根据Gail Erickson [MS]关于eggheadcafe的帖子,目前不支持.

如果没有创建一个只有日期的真实(非临时)表,有没有办法做到这一点?

我使用的是SqlServer2005.

sql t-sql sql-server sql-server-2005

5
推荐指数
1
解决办法
2573
查看次数

How can I use SQL to group and count the number of rows where the value for one column is <= x and the value for another column > x?

I'd like to group and count the number of entries in a table that meet criteria colA <= x < colB

Suppose I had the following table:

index  Game            MinAgeInclusive   MaxAgeExclusive
--------------------------------------------------------
1      Candy Land      3                 8
2      Checkers        5                 255
3      Chess           12                255
4      Sorry!          6                 12
5      Monopoly        10                30

(this isn't what I'm doing, but it abstracts away a lot of the other complications with my setup)

Suppose I wanted to get a table that told …

sql

5
推荐指数
1
解决办法
295
查看次数

计数子查询中的记录

我有一张表,其中记录着SQL Server 2008R2中的守卫巡逻。

每当值班开始时,都会创建一个新的警报编号,并在此警报编号内巡逻并启动一个时间。

如果执行了至少一次巡逻,则每12个小时我们将收取固定费用。如果在相同的警报编号下超过了12小时范围,则必须另外支付固定费用。

12小时的计算从第一次巡逻开始。

我尝试了一个临时表,但到目前为止无法解决。

DECLARE @t1 TABLE (
    AlertNo INT,
    Starttime SMALLDATETIME,
    Endtime SMALLDATETIME
)

INSERT INTO @t1 (AlertNo, Starttime, Endtime)

SELECT AlertNo,
       Starttimepatrol,
       DATEADD(HOUR, 12, Starttimepatrol)
FROM tblAllPatrols
WHERE PatrolNo = 1

SELECT AlertNo,
       (
           SELECT COUNT(*)
           FROM [tblAllPatrols] a
           INNER JOIN @t1 b ON b.AlertNo = a.AlertNo
           WHERE a.Starttimepatrol BETWEEN b.Starttime AND b.Endtime
       ) AS patrols
FROM [vwAlleDatensaetze]
GROUP BY AlertNo
Run Code Online (Sandbox Code Playgroud)

我知道这还不是故事的结局,但由于我什至无法计算巡逻的次数,因此无法找到解决问题的方法。

它应该以某种方式在每个警报编号的12小时范围内对巡逻进行“分组”,然后计算在同一警报编号下存在多少组。

希望你们中的某人可以带领我实现我需要的结果。

谢谢迈克尔的帮助

sql-server

5
推荐指数
1
解决办法
95
查看次数

爆炸整数范围以加入SQL

我有一个表在一个字段中存储一系列整数,有点像打印范围,(例如"1-2,4-7,9-11").该字段还可以包含单个数字.

我的目标是将此表连接到具有离散值而不是范围的第二个表.

所以,如果第一表包含

1-2,5
9-15
7
Run Code Online (Sandbox Code Playgroud)

而表二包含

1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)

联接的结果将是

1-2,5   1
1-2,5   2
1-2,5   5
7       7
9-15    9
9-15    10
Run Code Online (Sandbox Code Playgroud)

在SQL Server 2008 R2中工作.

sql t-sql join sql-server-2008

4
推荐指数
1
解决办法
1251
查看次数

在表中生成固定数量的行

无法正确表达问题,因此无法搜索我想要的内容。我所需要的只是一个带有一列say guids的虚拟表,我将它用于其他目的。没有实际写相同的insert .. newID()n 次,想知道是否有一个优雅的解决方案。

类似的问题是如何用一个 int 列填充一个空白表,比如 1-n 个数字。

Row1: 1
Row2: 2
.......
Row100:100
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server sql-server-2008

4
推荐指数
3
解决办法
1万
查看次数

使用SQL来INSERT基于QUERY的记录数

我有一个表在字段中有一个数字.基于该数字,我希望SQL将记录插入到另一个表中.下面是第一个表的示例:

Event    Fields   Type
Swimming 3        Basic
Swimming 2        Advanced
Running  5        Basic
Running  1        Advanced
Run Code Online (Sandbox Code Playgroud)

所以根据上面的表格,我希望SQL能够插入下面的记录:

Event    GradeType    Grade
Swimming Basic1       NULL
Swimming Basic2       NULL
Swimming Basic3       NULL
Swimming Advanced1    NULL
Swimming Advanced2    NULL
Running  Basic1       NULL
Running  Basic2       NULL
Running  Basic3       NULL
Running  Basic4       NULL
Running  Basic5       NULL
Running  Advanced1    NULL
Run Code Online (Sandbox Code Playgroud)

我想我需要使用WHILE来循环但不知道从哪里开始!所有帮助赞赏.

sql t-sql sql-server

3
推荐指数
1
解决办法
61
查看次数

如何创建一系列连接稀疏数据的月份?

我认为这是一个非常常见的问题,但我不知道这个过程是什么,所以我将用一个例子来描述它.这个概念是我想将稀疏数据集加入到完整的系列中,例如一周中的几天,一年中的几个月或任何有序集(例如,排名).稀疏数据中的空位置将在完整系列旁边显示为NULL.

假设我在SQL Server中运行以下查询以查找每月销售额.

SELECT
    YEAR([timestamp]),
    MONTH([timestamp]),
    COUNT(*)
FROM table1
WHERE YEAR([timestamp]) = YEAR(GETDATE())
GROUP BY
    YEAR([timestamp]),
    MONTH([timestamp])
ORDER BY
    YEAR([timestamp]) DESC,
    MONTH([timestamp]) DESC;
Run Code Online (Sandbox Code Playgroud)

但是,如果销售仅发生在今年的5月和8月,那么返回结果将如下所示:

2010    August    1234
2010    May       5678
Run Code Online (Sandbox Code Playgroud)

我希望我的返回结果集看起来像这样:

2010    January
2010    February
2010    March
2010    April
2010    May        1234
2010    June
2010    July
2010    August     5678
2010    September
2010    October
2010    November
2010    December
Run Code Online (Sandbox Code Playgroud)

我知道这样做的唯一方法是:

SELECT
    YEAR(GETDATE()),
    month_index.month_name,
    sales_data.sales
FROM (
    SELECT 'January' as month_name, 1 as month_number
    UNION
    SELECT 'February', 2
    UNION
    SELECT 'March', 3
    UNION …
Run Code Online (Sandbox Code Playgroud)

sql-server series sparse-matrix

2
推荐指数
2
解决办法
7480
查看次数

在C#中将100 000条记录插入MDB文件的最快方法是什么?

我知道这些问题相当普遍,但我整天都在搜索,但我找不到合适的方法.

这是我的代码,使用C#将大约100 000个虚拟记录插入到MDB文件中.

OleDbConnection con = new OleDbConnection();
string dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;";
string dbSource = "Data Source = D:/programming/sample.mdb";
con.ConnectionString = dbProvider + dbSource;
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = con;
cmd.CommandText = "INSERT INTO tblBooks (Title, Price, Tag, Author) VALUES (@title, @price, @tag, @author)";
cmd.Parameters.AddWithValue("@title", "Dummy Text 1");
cmd.Parameters.AddWithValue("@price", 10);
cmd.Parameters.AddWithValue("@tag", "Dummy Text 2");
cmd.Parameters.AddWithValue("@author", "Dummy Text 3");
con.Open();

for (int i = 0; i < 100000; i++)
{
    cmd.ExecuteNonQuery();    
}

 con.Close();
Run Code Online (Sandbox Code Playgroud)

此代码大约需要一分钟才能运行.这是正常的吗?更快地做到这一点的正确方法是什么?

c# oledb ms-access

2
推荐指数
1
解决办法
4681
查看次数

选择不存在的行

假设我有一张桌子:

ColumnA       ColumnB
---------------------------------
1             10.75
4             1234.30
6             2000.99
Run Code Online (Sandbox Code Playgroud)

如何编写将导致以下结果的SELECT查询:

ColumnA    ColumnB
---------------------------------
1             10.75
2             0.00
3             0.00
4             1234.30
5             0.00
6             2000.99
Run Code Online (Sandbox Code Playgroud)

sql sql-server sql-server-2005 sql-server-2008 sql-server-2008-r2

2
推荐指数
1
解决办法
196
查看次数

带有列号的SQL循环

我有一张3柱和4排的桌子.

        Col1    Col2    Col3
Row1    A1      B1      1
Row2    A2      B2      0
Row3    A3      B3      3
Row4    A4      B4      1
Run Code Online (Sandbox Code Playgroud)

一个select * from [table]回报:

A1 B1 1
A2 B2 0
A3 B3 3
A4 B4 1
Run Code Online (Sandbox Code Playgroud)

我想要一个选择:

A1 B1 1
A3 B3 3 
A3 B3 3
A3 B3 3
A4 B4 1
Run Code Online (Sandbox Code Playgroud)

Col3给出行返回的数量.

sql sql-server sql-server-2014

2
推荐指数
1
解决办法
81
查看次数