Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 表示不存在的行或空行_Sql Server 2008_Ssrs 2008 - Fatal编程技术网

Sql server 2008 表示不存在的行或空行

Sql server 2008 表示不存在的行或空行,sql-server-2008,ssrs-2008,Sql Server 2008,Ssrs 2008,我需要能够使用TSQL为SSRS2008中的数据集提取行。我用的是三表产品,库存,电话。产品有一个复合键,即制造商和零件号,这些字段是其他两个表中的外键。calls表创建一行,该行对特定月份的呼叫数求和,并以yyyymm格式表示该月份。我想做的是提取每个部分的最后一次调用,但我想忽略当前月份,因此我有以下内容: select product.mfg, product.part_number, max(calls.yyyymm) last_call from product inner join

我需要能够使用TSQL为SSRS2008中的数据集提取行。我用的是三表产品,库存,电话。产品有一个复合键,即制造商和零件号,这些字段是其他两个表中的外键。calls表创建一行,该行对特定月份的呼叫数求和,并以yyyymm格式表示该月份。我想做的是提取每个部分的最后一次调用,但我想忽略当前月份,因此我有以下内容:

select product.mfg, product.part_number, max(calls.yyyymm) last_call
from product inner join stock on product.mfg = stock.mfg 
and product.part_number = stock.part_number
left join calls on product.mfg = calls.mfg 
and product.part_number = calls.part_number
where stock.onhand > 0 and calls.yyyymm < '201202'
我最终想要做的是创建两个数据集,一个用于库存部件,另一个用于调用库存部件,然后使用SSRS 2008中的查找功能创建报告,但我希望两个数据集生成相同数量的行,因为这是一个移动目标。这不是我喜欢的方法,但我们的零件经理希望我在每个月底冻结数据,这就是为什么我决定尝试忽略当月的所有呼叫。对于当前月份的每个调用,如果下一个调用存在,我希望使用它,如果不存在,则插入null

这是一个非常小的数据示例,我认为所有的变化都包括在内

use tempdb;
GO
CREATE TABLE dbo.product(mfg VARCHAR(32), part_number CHAR(5))

INSERT dbo.product SELECT 'mfg1','12345';
INSERT dbo.product SELECT 'mfg2','98765';
INSERT dbo.product SELECT 'mfg3','A1234';
INSERT dbo.product SELECT 'mfg4','5678A';

CREATE TABLE dbo.stock(mfg VARCHAR(32), part_number CHAR(5), onhand INT);

INSERT dbo.stock SELECT 'mfg1','12345',30;
INSERT dbo.stock SELECT 'mfg2','98765', 1;
INSERT dbo.stock SELECT 'mfg3','A1234', 9;
INSERT dbo.stock SELECT 'mfg4','5678A', 0;

CREATE TABLE dbo.calls(mfg VARCHAR(32), part_number CHAR(5), yyyymm CHAR(6));

INSERT dbo.calls SELECT 'mfg1','12345','201101';
INSERT dbo.calls SELECT 'mfg1','12345','201202';
INSERT dbo.calls SELECT 'mfg2','98765','201202';
当前结果集:

mfg       part_number          last_call
mfg1      12345                 201101
mfg3      A1234                 NULL
我想要的是:

mfg        part_number         last_call
mfg1       12345               201101
mfg2       98765               NULL
mfg3       A1234               NULL
我认为它只需要:

SELECT p.mfg, p.part_number, last_call = max(c.yyyymm)
  FROM dbo.product AS p
  INNER JOIN dbo.stock AS s
    ON p.mfg = s.mfg AND p.part_number = s.part_number
  LEFT OUTER JOIN dbo.calls AS c
    ON p.mfg = c.mfg AND p.part_number = c.part_number
    AND c.yyyymm < '201202' -- only change
WHERE s.onhand > 0;
为什么??因为将外部联接条件移动到where子句会将外部联接转换为内部联接。

我认为它只需要:

SELECT p.mfg, p.part_number, last_call = max(c.yyyymm)
  FROM dbo.product AS p
  INNER JOIN dbo.stock AS s
    ON p.mfg = s.mfg AND p.part_number = s.part_number
  LEFT OUTER JOIN dbo.calls AS c
    ON p.mfg = c.mfg AND p.part_number = c.part_number
    AND c.yyyymm < '201202' -- only change
WHERE s.onhand > 0;
为什么??因为将外部联接条件移动到where子句会将外部联接转换为内部联接。

您使用的where子句要求calls.yyymm不为NULL:

select product.mfg, product.part_number, max(calls.yyyymm) last_call 
  from product inner join
    stock on product.mfg = stock.mfg and product.part_number = stock.part_number left join
    calls on product.mfg = calls.mfg and product.part_number = calls.part_number 
    where stock.onhand > 0 and calls.yyyymm < '201202'
您使用的WHERE子句要求calls.yyyymm不为NULL:

select product.mfg, product.part_number, max(calls.yyyymm) last_call 
  from product inner join
    stock on product.mfg = stock.mfg and product.part_number = stock.part_number left join
    calls on product.mfg = calls.mfg and product.part_number = calls.part_number 
    where stock.onhand > 0 and calls.yyyymm < '201202'

能否显示几行样本数据,以及缺少的行希望显示什么?stock.qty应该是stock.onhand吗?能否显示几行样本数据,以及缺少的行希望显示什么?stock.qty应该是stock.onhand吗?