2013-02-07 90 views
0

我正在创建一个包含多个子查询的大型SELECT查询。每个子查询工作正常,除了其中一个('吨/米')。我使用了与其他链接和值相同的链接和值,但它在不同的数据库中使用不同的表格。但是语法对我来说看起来是正确的,如果我把这个有问题的子选取出来并自行运行,它就可以工作。子查询不返回结果

这是测试分选(通过硬编码参数)成功返回行的一个...

SELECT SUM((OreNo*CONVERT(decimal(10,2),ISNULL(round((Code1),2),0))) + (WasteNo*CONVERT(decimal(10,2),ISNULL(round((Code2),2),0))) + (WFG*CONVERT(decimal(10,2),ISNULL(round((Code3),2),0)))) 
    FROM BETA..Bogging, BETA..Equipment, OperationalAssetDetail 
    WHERE EquipmentName = 'LD038' and 
    OperationalAssetDetail.Name = EquipmentNameMainpac and 
    BETA..Bogging.EquipmentID = BETA..Equipment.EquipmentID and 
    '2013-01' = RTRIM(CAST(DATEPART(year, Date) AS CHAR)) + '-' + right('0' + RTRIM(CAST(DATEPART(month, Date) AS CHAR)),2) 

...这是它返回的行...

(没有列名) 33900.00

......但后来我包括在主查询,并返回空...

declare @myAsset varchar(50) 
set @myAsset = 'LD038' 

select Name, months, 

ISNULL(
(
select CONVERT(decimal(10,2),ISNULL(round(ClassValue2,2),0)) 
from OperationalAssetDetail 
where 
Name = @myAsset and 
SortKeyName = 1000 and 
months >= RTRIM(CAST(DATEPART(year, InstallDate) AS CHAR)) + '-' + right('0' + RTRIM(CAST(DATEPART(month, InstallDate) AS CHAR)),2) and 
months <= RTRIM(CAST(DATEPART(year, ExpiryDate) AS CHAR)) + '-' + right('0' + RTRIM(CAST(DATEPART(month, ExpiryDate) AS CHAR)),2) 
) 
,0) as 'Ownership Cost', 

(
select CONVERT(decimal(10,2),ISNULL(round(sum(AdditionalCost),2),0)) 
from Transactiondetail 
where 
AccountStructureName like '%1625' and 
OperationalAssetName = OperationalAssetDetail.Name and 
ResourceName = 'Issue' and 
months = RTRIM(CAST(DATEPART(year, createtime) AS CHAR)) + '-' + right('0' + RTRIM(CAST(DATEPART(month, createtime) AS CHAR)),2) 
) as 'Operating Cost', 

(
select CONVERT(decimal(10,2),ISNULL(round(sum(AdditionalCost),2),0)) 
from Transactiondetail 
where 
AccountStructureName like '%1627' and 
OperationalAssetName = OperationalAssetDetail.Name and 
ResourceName = 'Issue' and 
months = RTRIM(CAST(DATEPART(year, createtime) AS CHAR)) + '-' + right('0' + RTRIM(CAST(DATEPART(month, createtime) AS CHAR)),2) 
) as 'Component Cost', 

(
select CONVERT(decimal(10,2),ISNULL(round(sum(AdditionalCost),2),0)) 
from Transactiondetail 
where 
AccountStructureName like '%1628' and 
OperationalAssetName = OperationalAssetDetail.Name and 
ResourceName = 'Issue' and 
months = RTRIM(CAST(DATEPART(year, createtime) AS CHAR)) + '-' + right('0' + RTRIM(CAST(DATEPART(month, createtime) AS CHAR)),2) 
) as 'Tyre Cost', 

(
select CONVERT(decimal(10,2),ISNULL(round(sum(AdditionalCost),2),0) + ClassValue2) 
from Transactiondetail 
where 
(AccountStructureName like '%1625' OR AccountStructureName like 'DM%1627' OR AccountStructureName like 'DM%1628') and 
OperationalAssetName = OperationalAssetDetail.Name and 
ResourceName = 'Issue' and 
months = RTRIM(CAST(DATEPART(year, createtime) AS CHAR)) + '-' + right('0' + RTRIM(CAST(DATEPART(month, createtime) AS CHAR)),2) 
) as 'Total Cost', 

CASE OperationalAssetDetail.Name 
WHEN 'DR%' THEN 
     (
     select CONVERT(decimal(10,2),ISNULL(round(sum(Value),2),0)) 
     from UsageDetail 
     where (OperationalAssetName LIKE OperationalAssetDetail.Name + '-07' OR OperationalAssetName LIKE OperationalAssetDetail.Name + '-08') and 
     months = RTRIM(CAST(DATEPART(year, createtime) AS CHAR)) + '-' + right('0' + RTRIM(CAST(DATEPART(month, createtime) AS CHAR)),2) 
    ) 
WHEN 'LH%' THEN 
     (
     select CONVERT(decimal(10,2),ISNULL(round(sum(Value),2),0)) 
     from UsageDetail 
     where OperationalAssetName = OperationalAssetDetail.Name + '-08' and 
     months = RTRIM(CAST(DATEPART(year, createtime) AS CHAR)) + '-' + right('0' + RTRIM(CAST(DATEPART(month, createtime) AS CHAR)),2) 
    ) 
ELSE 
     (
     select CONVERT(decimal(10,2),ISNULL(round(sum(Value),2),0)) 
     from UsageDetail 
     where OperationalAssetName = OperationalAssetDetail.Name and 
     months = RTRIM(CAST(DATEPART(year, createtime) AS CHAR)) + '-' + right('0' + RTRIM(CAST(DATEPART(month, createtime) AS CHAR)),2) 
    ) 
END as 'Engine Hours', 

CASE OperationalAssetDetail.Name 
WHEN 'LD%' THEN 
     (
     SELECT SUM((OreNo*CONVERT(decimal(10,2),ISNULL(round((Code1),2),0))) + (WasteNo*CONVERT(decimal(10,2),ISNULL(round((Code2),2),0))) + (WFG*CONVERT(decimal(10,2),ISNULL(round((Code3),2),0)))) 
     FROM BETA..Bogging, BETA..Equipment, OperationalAssetDetail 
     WHERE EquipmentName = @myAsset and 
     OperationalAssetDetail.Name = EquipmentNameMainpac and 
     BETA..Bogging.EquipmentID = BETA..Equipment.EquipmentID and 
     months = RTRIM(CAST(DATEPART(year, Date) AS CHAR)) + '-' + right('0' + RTRIM(CAST(DATEPART(month, Date) AS CHAR)),2) 
    )    
END as 'Tonnes/Metres' 

from months, OperationalAssetDetail 
where 
Name = @myAsset and 
SortKeyName = 1000 and 
months >= RTRIM(CAST(DATEPART(year, InstallDate) AS CHAR)) + '-' + right('0' + RTRIM(CAST(DATEPART(month, InstallDate) AS CHAR)),2) and 
months <= RTRIM(CAST(DATEPART(year, CURRENT_TIMESTAMP) AS CHAR)) + '-' + right('0' + RTRIM(CAST(DATEPART(month, CURRENT_TIMESTAMP) AS CHAR)),2) 

...这里的结果...

Name months Ownership Cost Operating Cost Component Cost Tyre Cost Total Cost Engine Hours Tonnes/Metres 
LD038 2010-08 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2010-09 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2010-10 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2010-11 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2010-12 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2011-01 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2011-02 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2011-03 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2011-04 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2011-05 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2011-06 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2011-07 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2011-08 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2011-09 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2011-10 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2011-11 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2011-12 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2012-01 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2012-02 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2012-03 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2012-04 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2012-05 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2012-06 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2012-07 45072.37 0.00 0.00 0.00 45072.37 0.00 NULL 
LD038 2012-08 45072.37 0.00 0.00 0.00 45072.37 7659.00 NULL 
LD038 2012-09 45072.37 839.49 0.00 0.00 45911.86 191.00 NULL 
LD038 2012-10 45072.37 2817.43 0.00 20382.67 68272.47 488.00 NULL 
LD038 2012-11 45072.37 3103.25 0.00 0.00 48175.62 358.00 NULL 
LD038 2012-12 45072.37 1322.96 0.00 0.00 46395.33 461.00 NULL 
LD038 2013-01 45072.37 23346.40 0.00 0.00 68418.77 225.00 NULL 
LD038 2013-02 45072.37 507.58 0.00 0.00 45579.95 0.00 NULL 
+0

好一个请停止做这一切铸串胡说:'RTRIM(CAST(DATEPART(月,日)' –

回答

1

我没有看到有关CASE statment用于音频/平方米ELSE语句。尝试添加ELSE声明并查看它是否返回其他值,那么你知道你的条件工作不正确。

(这将是OperationalAssetDetail.Name!=“LD%”)

尝试以此为案例,看看如果返回“Wenis”,如果你知道你的情况下,条件是不工作。

CASE OperationalAssetDetail.Name WHEN 'LD%' THEN (SELECT SUM((OreNo*CONVERT(decimal(10,2),ISNULL(round((Code1),2),0))) + (WasteNo*CONVERT(decimal(10,2),ISNULL(round((Code2),2),0))) + (WFG*CONVERT(decimal(10,2),ISNULL(round((Code3),2),0)))) FROM BETA..Bogging, BETA..Equipment, OperationalAssetDetail WHERE EquipmentName = @myAsset and OperationalAssetDetail.Name = EquipmentNameMainpac and BETA..Bogging.EquipmentID = BETA..Equipment.EquipmentID and months = RTRIM(CAST(DATEPART(year, Date) AS CHAR)) + '-' + right('0' + RTRIM(CAST(DATEPART(month, Date) AS CHAR)),2)) 
ELSE 0 
END as 'Tonnes/Metres' 

也为调试添加

OperationalAssetDetail.Name 

由于列结果在视觉上的一个看到它是什么。

此选择需要LOT的工作。

+0

SELECT * FROM月 月 2010-01 2010-02 2010-03 -04 2010-05 2010-06 2010-07 2010-08 2010-09 2010-10 2010-11 2010-12 2011-01 2011-02 2011-03 2011-04 2011-05 2011-06 2011-07 2011-08 2011-09 2011-10 2011-11 2011-12 2012-01 2012-02 2012-03 2012-04 2012-03 -06 2012-07 2012-08 2012-09 2012-10 2012-11 2012-12 2013-01 2013-02 2013-03 2013-04 2013-05 2013-06 2013年7月 2013-08 2013-09 2013-10 2013-11 2013-12 2014-01 2014-02 2014-03 2014-04 2014-05 2014-06 2014 -07 2014-08 2014-09 2014-10 2014-11 2014-12 2015-01 2015-02 2015-03 2015-04 2015-05 2015-06 2015-07 2015-08 2015-09 2015-10 – user2048936

+0

嗯,当我添加ELSE语句时,我得到所有的ZEROS而不是NULLS,所以看起来SELECT永远不会被处理。这有助于,谢谢! ELSE END as'Tonnes/Meters' – user2048936

+0

正如我怀疑的那样。添加列OperationalAssettDetail.Name来查看它的值。那么你可以随时接受我的答案! – cgatian