我需要创建一个返回连续日期表的函数.我会传递一个最小和最大日期.
我希望它可以这样调用:
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.
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 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小时范围内对巡逻进行“分组”,然后计算在同一警报编号下存在多少组。
希望你们中的某人可以带领我实现我需要的结果。
谢谢迈克尔的帮助
我有一个表在一个字段中存储一系列整数,有点像打印范围,(例如"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中工作.
无法正确表达问题,因此无法搜索我想要的内容。我所需要的只是一个带有一列say guids的虚拟表,我将它用于其他目的。没有实际写相同的insert .. newID()n 次,想知道是否有一个优雅的解决方案。
类似的问题是如何用一个 int 列填充一个空白表,比如 1-n 个数字。
Row1: 1
Row2: 2
.......
Row100:100
Run Code Online (Sandbox Code Playgroud) 我有一个表在字段中有一个数字.基于该数字,我希望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来循环但不知道从哪里开始!所有帮助赞赏.
我认为这是一个非常常见的问题,但我不知道这个过程是什么,所以我将用一个例子来描述它.这个概念是我想将稀疏数据集加入到完整的系列中,例如一周中的几天,一年中的几个月或任何有序集(例如,排名).稀疏数据中的空位置将在完整系列旁边显示为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) 我知道这些问题相当普遍,但我整天都在搜索,但我找不到合适的方法.
这是我的代码,使用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)
此代码大约需要一分钟才能运行.这是正常的吗?更快地做到这一点的正确方法是什么?
假设我有一张桌子:
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
我有一张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给出行返回的数量.