需要一个 SQL 查询来从 SQL Server 数据库中获取特定条件下给定时间段的数据

Posted

技术标签:

【中文标题】需要一个 SQL 查询来从 SQL Server 数据库中获取特定条件下给定时间段的数据【英文标题】:Need a SQL query to get data from SQL Server database for a given period with certain condition 【发布时间】:2016-10-13 02:25:27 【问题描述】:

我有一个带有 7 列的表 dbo.sales 的 SQL Server 数据库。

第一列包含不同的销售人员姓名,第 2 列到第 6 列是其他信息,第 7 列是销售平均值。

问题:我需要一个查询来获取所有销售人员的详细信息(Excel 中的所有七列),如果他们的销售平均值在给定日期之间超过 60%。

例如: 在我的数据库中,如果我在 Excel 工作表中输入 2016 年 5 月 25 日到 31 日之间的时间段,我的数据是从 2016 年 1 月 5 日到 2016 年 5 月 31 日/05/2016 和我要求的前平均值。 60%(应根据我的需要更改),然后我需要所有在 2016 年 5 月 25 日至 31 日期间平均销售额持续超过 60% 的销售人员详细信息。

如果在 5 月 28 日某个销售人员的平均水平下降到 60% 以下,那么我不想在我的报告中看到他。简而言之,我需要所有在我的搜索期内平均销售额持续达到 60% 或以上的销售人员。

【问题讨论】:

欢迎来到 ***。请注意,这不是免费的代码编写服务。然而,我们渴望用他们的代码帮助其他程序员(和有志者)。请阅读How do I Ask a Good Question 上的帮助主题。您可能还想take the tour 并在这样做的同时获得徽章。之后,请使用您迄今为止编写的 SQL 代码更新您的问题,以完成您希望完成的任务。此外,更新标签以反映您正在使用的 DB-Server:mysql SQL-Server。 这不太可能与 MySQL 有关。请edit您的问题以删除该标签。 【参考方案1】:

不确定销售期间日期是否在表内,但如果是,则该查询应该适合您:

;WITH PeriodSales as (
    SELECT * FROM Sales
    WHERE SalseDate between @StartDt and @EndDt)
SELECT * FROM PeriodSales
WHERE SalesPerson not in (
    SELECT SalesPerson FROM PeriodSales
    WHERE CASE WHEN IsNumeric(salesavg) = 1 
            THEN CAST(salesavg as Decimal) ELSE 0 END <= 60.
    );

【讨论】:

为什么需要 CTE?似乎只有一个查询可以做到这一点。 你是对的。我只是厌倦了两次键入“@StartDt 和@EndDt 之间的SalseDate”。甚至在“SalseDate”中出现拼写错误。更少的打字 - 更少的错误。 非常感谢斯拉瓦。我收到错误“将 varchar 值 45 转换为数据类型 int 时转换失败。”请注意,我无法更改数据库类型。您能否通过调整查询来帮助解决此问题。 您没有指定您的 SalesAverage 是 varchar。请提供该值的样本。这会影响查询。 抱歉 Slava 没有提供正确的信息。在我的 sales.dbo 中,我有 7 列,并且都是数据类型 varchar。其中,重要的 3 列是 salesmanname、date、salesavg。我想查看在我的搜索日期之间连续超过 60% 的销售量的销售人员。

以上是关于需要一个 SQL 查询来从 SQL Server 数据库中获取特定条件下给定时间段的数据的主要内容,如果未能解决你的问题,请参考以下文章

需要一个查询来从所有表/视图中搜索一个值(“数字”)

我想编写一个 sql (Oracle SQL) 查询来从特定字符之后的列中选择字符串的一部分

在 SQL Server 中更改列数据

T-SQL查询进阶—理解SQL Server中的锁

SQL 查询在 SQL Server CE 中很慢,但在 SQL Server 中很快

SQL Server 2005 查询优化