需要一个 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) 查询来从特定字符之后的列中选择字符串的一部分