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