标签: t-sql

在 Where 子句中执行聚合

我想执行以下查询,该查询基本上显示计算的位置 >= .70 或 <= -.70 但是,我收到错误

消息 147,级别 15,状态 1,第 8 行
聚合可能不会出现在 WHERE 子句中,除非它位于包含在 HAVING 子句或选择列表中的子查询中,并且被聚合的列是外部引用。

这是示例 DDL - 编写此查询的合适方法是什么?

    Declare @Hamburger Table (empName varchar(200), e float, a float, saleid varchar(10))
Insert Into @Hamburger (empName, e,a, saleid) Values
('Jake', 362, 233, 'E111'), ('Jake', 1431, 2702, 'E112'), ('Blue', 849, 280, 'R222'), ('Blue', 1418, 299, 'R390')

Select empName, e, a, saleid, AmtGained = Sum(Coalesce(e,0))-Sum(Coalesce(a,0)),
DiscountPercent = Sum(Coalesce(e,0)-Coalesce(a,0))/NullIf(Sum(Coalesce(e,0)),0)
From @Hamburger
where ((Sum(Coalesce(e,0)-Coalesce(a,0))/NullIf(Sum(Coalesce(e,0)),0) >= .70)
OR (Sum(Coalesce(e,0)-Coalesce(a,0))/NullIf(Sum(Coalesce(e,0)),0) <= -.70))
Group By empName, …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

0
推荐指数
1
解决办法
300
查看次数

您如何使用 Ola.Hallengren 的脚本跳过数据库?

我有几个数据库,前端应用程序在其中管理某些维护任务。在这个特定的例子中,我每晚都在运行 INDEX OPTIMIZE 作业,它经常与应用程序发生冲突并失败。

以下是我收到的错误:

Msg 50000, Level 16, State 1, Server MyTestServer01, Procedure CommandExecute, Line 152
Msg 2550, The index "clidx_StatisticalInterface_dPollTime" (partition 1) on table "StatisticalInterface" cannot be reorganized because it is being reorganized by another process.
Run Code Online (Sandbox Code Playgroud)

我知道有时供应商宁愿他们的内置解决方案管理维护。我确定我可以在应用程序中找到该功能并将其关闭,但这个问题是为了以防万一。

我将如何配置或编辑此作业以忽略同一实例中的特定数据库或数据库列表?

sql-server t-sql ola-hallengren

0
推荐指数
1
解决办法
2947
查看次数

'SELECT *' 子查询效率低下吗?

我们有一个第三方分析平台,允许最终用户从选择的预定义视图中创建自己的表格和图表。这将查询 MS SQL 数据库。

不幸的是,根据我的知识和理解,该软件注入数据库以查询数据的 SQL 语法似乎非常低效,或者看起来如此。

例如,以下是将两个表连接在一起的查询的样子:

SELECT tblOne.ColumnOne, tblOne.ColumnTwo, tblTwo.ColumnThree
FROM (SELECT * FROM tblOne) AS tblOne
JOIN (SELECT * FROM tblTwo) AS tblTwo ON tblOne.id = tblTwo.id
Run Code Online (Sandbox Code Playgroud)

现在想象这些表每个都有很多列,或者有更多连接到附加表,每个表都遵循相同的模式 - 我假设这将在子查询中执行全表扫描,有效地读取比实际需要的更多的数据是否正确?我是否也正确地假设以下内容实际上会更有效?

SELECT tblOne.ColumnOne, tblOne.ColumnTwo, tblTwo.ColumnThree
FROM tblOne
JOIN tblTwo ON tblOne.id = tblTwo.id
Run Code Online (Sandbox Code Playgroud)

在我给这个分析解决方案的开发人员写一封措辞强硬的电子邮件之前,我只是想要第二个意见,以防万一我误解了引擎将如何处理这样的查询。

提前致谢。

performance sql-server optimization t-sql query-performance

0
推荐指数
1
解决办法
540
查看次数

平均值不起作用

我有一个不同报告周期的学生和成绩数据库。每个报告周期都有一个唯一的 ID,每个主题也有一个唯一的 ID。学生每个科目可以有不止一位老师,所以我需要平均给定的成绩,并只给出他们成绩的平均成绩。原始数据示例如下:

+--------------+------+-----+----+-------------+---+
| 223599152142 |   12 |  92 |  3 | Mathematics | 0 |
| 223599152142 |   12 |  92 |  3 | Mathematics | 3 |
| 223599152142 |   12 |  92 |  7 | History     | 3 |
| 223599152142 |   12 |  92 | 12 | Economics   | 3 |
| 223599152142 |   12 |  92 | 12 | Economics   | 4 |
| 223599152142 |   12 |  92 | 26 | Latin       | …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql cast decimal

0
推荐指数
1
解决办法
417
查看次数

有没有办法识别数据库同义词背后的对象?

我有一个使用同义词的脚本。我必须更改该代码,问题是我无法理解同义词指的是哪个对象。有办法查到吗?我正在使用创建该同义词的原始数据库实例。

PS 我正在使用 MS SQL Server。

谢谢你的时间。

sql-server t-sql synonyms

0
推荐指数
1
解决办法
44
查看次数

DOWS 在 T-SQL 中的含义

我正在读一本书,其中显示了这个例子

SELECT wait_type ,
SUM(wait_time_ms / 1000) AS [wait_time_s]
FROM sys.dm_os_wait_stats DOWS
WHERE wait_type NOT IN ( 'SLEEP_TASK', 'BROKER_TASK_STOP',
'SQLTRACE_BUFFER_FLUSH', 'CLR_AUTO_EVENT',
'CLR_MANUAL_EVENT', 'LAZYWRITER_SLEEP' )
GROUP BY wait_type
ORDER BY SUM(wait_time_ms) DESC
Run Code Online (Sandbox Code Playgroud)

我想知道 FROM 语句旁边的关键字 DOWS 的确切作用(含义)。我试图搜索,但没有找到任何有用的东西。谢谢你的时间!

sql-server t-sql

0
推荐指数
1
解决办法
75
查看次数

不要在 Query Store Clean 上 RESEED 表

我们正在使用查询存储。现在我们通过每晚清理查询存储解决了一个问题。当您清理查询存储时,查询存储表正在被RESEED编辑 :-(

您知道如何在不RESEED使用表的情况下清理查询存储吗?

sql-server t-sql truncate query-store

0
推荐指数
1
解决办法
212
查看次数

从多个数据库创建视图

Database X - tableCust - Column-CustNumber
Database Y - tableCust - Column-Custnumber
Datbase Z - tableCust - Column-Custnumber
Run Code Online (Sandbox Code Playgroud)

我正在尝试从这三个数据库中的数据库 H 中创建一个视图,如下所示。

Select Custnumber,Orginal_DB_Name() as DatabaseName
from X.dbo.tablecust
Union 
Select Custnumber,Orginal_DB_Name() as DatabaseName
from Y.dbo.tablecust
;
;
;
etc
Run Code Online (Sandbox Code Playgroud)

但是数据库名称显示的是 Master 而不是他们的 DB_Name。

它需要显示如下输出:

Database_Name CustNumber
X               221
X               1223
Y                122
Y               233
"
"
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

0
推荐指数
1
解决办法
5074
查看次数

SQL PRINT 与 SQL EXEC

执行下面的查询时,如果我使用PRINT它打印正确。我可以复制并粘贴打印的代码并执行它。但是,如果我使用 EXEC,则会出现以下错误:

执行时出错

有没有办法简化我正在做的事情?为什么 SQLPRINT和 SQL 会EXEC提供这两种截然不同的结果集?

DECLARE @TableName as NVARCHAR(250), @SQL as VARCHAR(MAX);

DECLARE @TableCursor as CURSOR;
SET @TableCursor = CURSOR FOR
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U'
AND name like 'HISTORY_MasterList_%'
ORDER BY sobjects.name

OPEN @TableCursor;
FETCH NEXT FROM @TableCursor INTO @TableName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL ='select '''+ @TableName +''', 0
 Union All
select All ''Server Count'',count(1) from ['+ @TableName +'] 
 Union All
select All ''Server Cores'',sum(convert(decimal(18,0),cores)) …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server t-sql sql-server-2008-r2 sql-server-2012

0
推荐指数
1
解决办法
1371
查看次数

SQL Server 事务如何处理日志记录

我的课本上说:

从您开始事务时开始,您的更改与其他用户隔离。您正在做的事情只有您自己可以看到,并且在您 COMMIT 之前不会真正完成——尽管在您看来是真实的,但只有您才能看到结果。任何其他试图查看的人,他们都可以看到旧值,或者如果他们大胆,他们可能会得到脏读。

我很困惑,所以我将使用下面的图片提出一些问题: 在此处输入图片说明 和 t-sql 代码是

BEGIN TRAN
UPDATE checking
 SET Balance = Balance - 1000
 WHERE Account = 'Sally'    // original balance is 2000
--------------a checkpoint occurs ---------
UPDATE savings
 SET Balance = Balance + 1000
 WHERE Account = 'Sally'
COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)

并且我们知道,只有在执行了“COMMIT TRAN”之后,才会在日志缓冲区中创建描述 COMMIT 的新日志记录。

Q1- 为什么在 COMMIT 之前结果只对我可见? 假设在检查 sally 为负 -1000 后发生检查点,并且更新的记录位于第 4 页(内存中),因为它尚未提交,因此不会有日志记录日志缓冲区,因此磁盘(.ldf)中不会有相应的日志记录,但缓存第4页将写入磁盘(.mdf),因此任何用户都可以看到该记录的最新更改?

Q2-这种情况下事务控制如何保持原子性?

正如我所讨论的,当检查点发生时,第 4 页(在缓存中,包含记录的最新余额值:1000)将被写入磁盘,如果出现系统故障立即。SQL server重启后,.ldf文件中没有日志记录,如何知道如何将记录的余额(当前为1000)恢复到原来的值(余额为2000)?

sql-server t-sql transaction transaction-log checkpoint

0
推荐指数
1
解决办法
119
查看次数