当未找到特定日期的记录时,返回结果集中的行

2024-01-05

我创建了一个查询来返回以下输出。

Date          Day      Sale Qty     Purchase Qty      Transfer Qty
------------------------------------------------------------------
05/04/2015    1           11             0                0
07/04/2015    3            0            16                0
08/04/2015    4           12            14               17
11/04/2015    7            1             2                0

我当前的查询如下。

(select T1.Date,T1.Day,T1.SaleQty,0 as PurchaseQty,0 as TransferQty from SaleTable T1)
union all
(select T2.Date,T2.Day,0 as SaleQty,T2.PurchaseQty,0 as TransferQty from PurchaseTable T2)
union all
(select T3.Date,T3.Day,0 as SaleQty,0 as PurchaseQty,T3.TransferQty from TransferTable T3)

所需的输出采用以下格式

Date          Day      Sale Qty     Purchase Qty      Transfer Qty
------------------------------------------------------------------
05/04/2015    1           11             0                0
06/04/2015    2            0             0                0
07/04/2015    3            0            16                0
08/04/2015    4           12            14               17
09/04/2015    5            0             0                0
10/04/2015    6            0             0                0
11/04/2015    7            1             2                0

当没有为该日期输出返回结果集时,我应该如何编写查询以返回包含日期和日期的行。


您需要一个表作为缺失日期和天数的查找表,以覆盖查询结果中的日期范围。您可以像这样创建一个:

-- add a temp table for your sample data
CREATE TABLE #Results
    ([Date] datetime, [Day] int, [Sale Qty] int, [Purchase Qty] int, [Transfer Qty] int)
;
-- insert your sample data
INSERT INTO #Results
    ([Date], [Day], [Sale Qty], [Purchase Qty], [Transfer Qty])
VALUES
    ('2015-04-05 00:00:00', 1, 11, 0, 0),
    ('2015-04-07 00:00:00', 3, 0, 16, 0),
    ('2015-04-08 00:00:00', 4, 12, 14, 17),
    ('2015-04-11 00:00:00', 7, 1, 2, 0)
;
-- find the max date
DECLARE @MaxDate DATETIME = (SELECT TOP 1 [Date] FROM #Results ORDER BY [Date] DESC)
-- recursive cte to build the date & day lookup table
;WITH cte AS (
    -- cte anchor is the min date and day = 1
    SELECT MIN([Date]) AS DateValue, 1 AS [Day] 
    FROM #Results
    UNION ALL
    -- uses dateadd to increment days until @MaxDate reached
    SELECT DATEADD(DAY, 1, cte.DateValue), [Day] +1
    FROM cte
    WHERE DATEADD(DAY, 1, cte.DateValue) <= @MaxDate
)
-- inserts values into temp lookup table
SELECT * 
INTO #DateLookup
FROM cte

这将创建一个临时表,其中包含使用保存这些值的结果中的最低和最高日期的值范围:

DateValue                Day
----------------------------
2015-04-05 00:00:00.000  1
2015-04-06 00:00:00.000  2
2015-04-07 00:00:00.000  3
2015-04-08 00:00:00.000  4
2015-04-09 00:00:00.000  5
2015-04-10 00:00:00.000  6
2015-04-11 00:00:00.000  7

然后,您需要链接到该表并替换任何NULL价值观与0像这样:

SELECT #DateLookup.[DateValue] AS [Date],
       #DateLookup.[Day] ,
       COALESCE([Sale Qty],0) AS [Sale Qty],
       COALESCE([Purchase Qty],0) AS [Purchase Qty],
       COALESCE([Transfer Qty],0) AS [Transfer Qty]
FROM #DateLookup
LEFT JOIN #Results ON #DateLookup.DateValue = #Results.[Date]

-- some tidy up
DROP TABLE #Results
DROP TABLE #DateLookup
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当未找到特定日期的记录时,返回结果集中的行 的相关文章

  • SSRS报告不显示数据

    我刚刚创建了 SQL Server 2005 SSRS 报告 数据未显示在预览窗格中 数据集是根据字符串参数从存储过程正确填充的 我可以在数据窗格中执行它 在预览窗格中运行报表时 会显示正确的行数 但单元格的内容不包含任何数据 源数据集基于
  • SQL CASE 语句

    我有以下查询 我想将它们放入 sql CASE 语句中 这样我只有一个查询 但我不知道该怎么做 有人可以帮助我吗 IF SELECT EtlLoadId FROM ssislogs audit processcontrol WHERE Su
  • 将记录与另一个表上的最新记录连接

    我正在尝试创建一个 SQL 视图 我如何从一个表中选择最新的记录 而其他记录保持原样 我需要从所有表中选择所有记录 这工作正常 但我需要仅按日期选择最新的提案 这是我遇到的问题 这是我到目前为止所拥有的 SELECT TOP 100 PER
  • 选择语句REF oracle

    我需要一些帮助来创建将使用引用的选择语句 我设法很好地插入了值 但是当我尝试使用 where 语句提取值时 输出要么是数据类型错误 要么会输出两个表以及它们都包含的数据 这只是一个例子 Create or replace table1 Ty
  • SQL查询3个表,无法得到所需的结果

    列出所有已售出的作品以及艺术家 订购日期和发货日期 SELECT title artist order date ship date FROM items orders orderline WHERE orders order id ord
  • 开发和生产 SQL Server 之间使用不同的排序规则会出现哪些问题?

    盘问 无法更新 sys columns 还有其他方法吗 https stackoverflow com questions 4018347 unable to update sys columns any other approach含糊地
  • 有向图 SQL

    我有以下数据集 它表示有向图中的节点 CREATE TABLE nodes NODE FROM VARCHAR2 10 NODE TO VARCHAR2 10 INSERT INTO nodes VALUES GT TG INSERT IN
  • 如何使用存储过程 SQL SERVER 2008 R2(mssql) 插入 PHP 数组值

    我有这个数组 REV Array 0 gt 240 1 gt 241 2 gt 242 3 gt 243 4 gt 249 我现在使用下面的代码进行插入 将每个数组的元素存储在带有 id userID Type 和 Date 的行中 if
  • ROUTINE_NAME 和 SPECIFIC_NAME 之间有什么区别?

    在 INFORMATION SCHEMA ROUTINES 视图中 存在 ROUTINE NAME 和 SPECIFIC NAME 按照MSDN http msdn microsoft com en us library ms188757
  • 在两个以上的表上使用内联接删除查询

    我想使用两个以上表上的内联接从表中删除记录 假设我有表 A B C D 其中 A 的 pk 在所有其他提到的表中共享 然后如何编写删除查询以使用表 B 和 A 上的内联接从表 D 中删除记录 因为条件是从这两个表中获取的 我需要从 DB2
  • 从 Visual Studio 调试 SQL Server 2005 中的存储过程?

    我在这里和其他地方看到很多令人沮丧的问题 但没有明确的答案 我试图让存储过程进行调试 但没有成功 客户端 VS2005或VS2008 两者都不起作用 当我从存储过程上下文菜单中选择 步入存储过程 时 我在调试窗口中看到 已被用户取消 这就是
  • 工厂模式数据库连接

    我正在尝试使用 MySQL 实现数据库连接上的工厂模式 SQL Server 面临奇怪的错误 你调用的对象是空的 在 SQL 命令对象上 internal class SqlServerDB IDatabase private SqlCon
  • 删除 Sql 服务器中最后一次出现特殊字符之前的子字符串

    我想删除最后一次出现句点之前的子字符串 查询应该转换r k Lee Brown to Lee Brown 所以 基本上我需要最后一个点之前的子字符串 并将其替换为 尝试这个 SELECT RIGHT str CHARINDEX REVERS
  • 将 SQL 中的数据存储在数组中

    我正在尝试将 sql 数据库中的数据存储到数组中 目前我有这个 query mysql query SELECT FROM InspEmail WHERE Company LIKE company while row mysql fetch
  • 如何从表中选择层次结构中的最低级别

    我有一个具有父 子关系的表 Table A Column Id int Column Parent Id int Column Description text 一组示例数据如下 999 NULL Corp 998 999 Div1 997
  • 使用聚合函数时减少 Athena 扫描的数据量

    以下查询扫描 100 MB 的数据 select from table where column1 val and partition id 20190309 然而 下面的查询扫描了 15 GB 的数据 有超过 90 个分区 select
  • 对 SQL Server 2005 结果进行分页

    如何在 SQL Server 2005 中对结果进行分页 我在 SQL Server 2000 中尝试过 但没有可靠的方法来做到这一点 我现在想知道SQL Server 2005是否有任何内置方法 分页的意思是 例如 如果我按用户名列出用户
  • 获取 SQL 表上未使用的唯一值

    我有一个表 其中有一列描述数字 ID 该 ID 对于所有行都是唯一的 但它不是主键 数字 ID 是有限的 假设答案可以是从 1 到 10 SELECT ID FROM TABLE ID 1 2 5 我必须 通过 UI 向用户呈现未使用的值
  • 在带有循环引用的表中插入 SQL

    我有 2 张桌子 Empleados numEmpl nombre apellido sexo telefono salario numDept Departamentos numDept nombreDept numDirect 在部门中
  • 根据 SQL 查询的集合生成成员的“散点图”结果

    我有一个staff包含工作人员的数据库表 其中user no and user name列 我还有一个 department 包含员工可以加入的部门的表 其中dept no and dept name作为列 因为员工可以是多个部门的成员 所

随机推荐