0

SQL Server 2008中子查询计算基于多个项目

我有几个股票表,使用数据如下

进馆:

Item_ID Barcode ITEM_CODE Cp_Id whLocId dt_added COLOUR_ID MRN_NO 
----------------------------------------------------------------------------- 
123456 222222 62626262 1 78 2014-10-31 23:04:02.920 2 99897 
123456 222222 62626262 1 78 2014-10-30 23:04:11.340 2 99897 
123456 222222 62626262 1 78 2014-07-23 23:04:16.273 2 99897 
123456 222222 62626262 1 78 2014-10-21 23:04:19.327 2 99897 
123456 222222 1234   1 74 2014-11-01 00:16:42.783 1 99897 
123456 222222 1234   1 74 2014-10-24 00:16:53.447 1 99897 
123456 222222 1234   1 74 2014-10-23 00:16:55.467 1 99897 
123456 222222 1234   1 74 2014-10-23 00:17:00.283 2 99897 
123456 222222 1234   1 74 2014-10-23 00:17:02.080 2 99897 
123456 222222 1234   1 70 2014-10-23 00:17:10.273 2 99897 
123456 222222 12348  1 70 2014-10-23 00:17:14.080 2 99897 
123456 222222 12348  1 78 2014-10-24 00:18:37.340 2 99897 
123456 222222 62626262 2 78 2014-10-24 00:24:38.977 2 99897 

内:

Item_ID Barcode ITEM_CODE Cp_Id whLocId dt_added COLOUR_ID PO_NO 
----------------------------------------------------------------------------- 
    123456 222222 62626262 1 78 2014-10-20 23:04:58.487 2 99897 
    123456 222222 62626262 1 78 2014-10-30 23:05:04.863 2 99897 
    123456 222222 12348 1 70 2014-10-26 00:17:39.780 2 99897 
    123456 222222 12348 1 78 2014-10-26 00:18:19.903 2 99897 

BLOCK:

Item_ID Barcode ITEM_CODE Cp_Id whLocId dt_added COLOUR_ID PO_NO 
----------------------------------------------------------------------------- 
    123456 222222 62626262 1 78 2014-10-31 23:03:43.923 2 99897 
    123456 222222 1234 1 74 2014-11-01 00:16:24.490 1 99897 

我试图产生将设在ITEM_CODE一个关闭报告,colour_id采用等

我尝试下面的逻辑,但每个项目的填充相同的输出。

`SELECT 
p.ITEM_CODE as ITEM_CODE, 
--(select COUNT(*) from inward where cast(dt_added as DATE)<>CAST(GETDATE() as DATE) group by item_code,whlocid)- (select COUNT(*) from outward where cast(dt_added as DATE)<>CAST(GETDATE() as DATE)and item_code='62626262' and colour_ID='2' group by item_code,whlocid)as Opening_Stock, 
(select COUNT(*) from inward where cast(dt_added as DATE)=CAST(GETDATE() as DATE)) as DAY_INWARD_Stock, 
(select COUNT(*) from inward) as 'TOTAL_INWARD_Stock', 
(select COUNT(*) from OUTWARD where cast(dt_added as DATE)=CAST(GETDATE() as DATE)) as DAY_OUTWARD_Stock, 
(select COUNT(*) from OUTWARD) as TOTAL_OUTWARD_Stock, 
--((select COUNT(*) from inward)-(select COUNT(*) from outward)) as TOTAL_AVAILABLE_STOCK, 
(select COUNT(*) from BLOCK where cast(dt_added as DATE)=CAST(GETDATE() as DATE))as DAY_BLOCK_Stock, 
(select COUNT(*) from BLOCK) as TOTAL_BLOCK_Stock, 
p.cp_id, 
p.whLocId, 
p.COLOUR_ID 
from inward p 

left join outward out 
on p.item_code=out.item_code 
left join block blo 
on p.item_code=blo.item_code 
group by p.item_code,p.cp_id,p.colour_id,p.whlocid` 

但它显示所有项目的相同值。

结果:

ITEM_CODE DAY_INWARD_Stock TOTAL_INWARD_Stock DAY_OUTWARD_Stock TOTAL_OUTWARD_Stock DAY_BLOCK_Stock TOTAL_BLOCK_Stock cp_id whLocId COLOUR_ID 
----------------------------------------------------------------------------- 
1234 1 13 0 4 1 2 1 74 1 
1234 1 13 0 4 1 2 1 70 2 
1234 1 13 0 4 1 2 1 74 2 
12348 1 13 0 4 1 2 1 70 2 
12348 1 13 0 4 1 2 1 78 2 
62626262 1 13 0 4 1 2 1 78 2 
62626262 1 13 0 4 1 2 2 78 2 

这有利于Machha谁是封闭2天希望的问题是明确和格式现在都很好

感谢

**试过,但其根据商品代码隔离但不符合cp_id,colour_id,whlocid **

`SELECT 
p.ITEM_CODE as ITEM_CODE, 
--(select COUNT(*) from inward where cast(dt_added as DATE)<>CAST(GETDATE() as DATE) group by item_code,whlocid)- (select COUNT(*) from outward where cast(dt_added as DATE)<>CAST(GETDATE() as DATE)and item_code='62626262' and colour_ID='2' group by item_code,whlocid)as Opening_Stock, 
(select COUNT(*) from inward where cast(dt_added as DATE)=CAST(GETDATE() as DATE) and item_code=p.item_code) as DAY_INWARD_Stock, 
(select COUNT(*) from inward where item_code=p.item_code) as 'TOTAL_INWARD_Stock', 
(select COUNT(*) from OUTWARD where cast(dt_added as DATE)=CAST(GETDATE() as DATE)and item_code=p.item_code) as DAY_OUTWARD_Stock, 
(select COUNT(*) from OUTWARD where item_code=p.item_code) as TOTAL_OUTWARD_Stock, 
--((select COUNT(*) from inward)-(select COUNT(*) from outward)) as TOTAL_AVAILABLE_STOCK, 
(select COUNT(*) from BLOCK where cast(dt_added as DATE)=CAST(GETDATE() as DATE)and item_code=p.item_code)as DAY_BLOCK_Stock, 
(select COUNT(*) from BLOCK where item_code=p.item_code) as TOTAL_BLOCK_Stock, 
p.cp_id, 
p.whLocId, 
p.COLOUR_ID 
from inward p 
left join outward out 
on p.item_code=out.item_code 
left join block blo 
on p.item_code=blo.item_code 
group by p.item_code,p.cp_id,p.colour_id,p.whlocid` 

结果:

ITEM_CODE DAY_INWARD_Stock TOTAL_INWARD_Stock DAY_OUTWARD_Stock TOTAL_OUTWARD_Stock DAY_BLOCK_Stock TOTAL_BLOCK_Stock cp_id whLocId COLOUR_ID 
----------------------------------------------------------------------------- 
1234 1 6 0 0 1 1 1 74 1 
1234 1 6 0 0 1 1 1 70 2 
1234 1 6 0 0 1 1 1 74 2 
12348 0 2 0 2 0 0 1 70 2 
12348 0 2 0 2 0 0 1 78 2 
62626262 0 5 0 2 0 1 1 78 2 
62626262 0 5 0 2 0 1 2 78 2 


`SELECT 
p.ITEM_CODE as ITEM_CODE, 
(select COUNT(*) from inward where cast(dt_added as DATE)<>CAST(GETDATE() as DATE) and item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid )- (select COUNT(*) from outward where cast(dt_added as DATE)<>CAST(GETDATE() as DATE) and item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid)as Opening_Stock, 
(select COUNT(*) from inward where cast(dt_added as DATE)=CAST(GETDATE() as DATE) and item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid) as DAY_INWARD_Stock, 
(select COUNT(*) from inward where item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid) as 'TOTAL_INWARD_Stock', 
(select COUNT(*) from OUTWARD where cast(dt_added as DATE)=CAST(GETDATE() as DATE)and item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid) as DAY_OUTWARD_Stock, 
(select COUNT(*) from OUTWARD where item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid) as TOTAL_OUTWARD_Stock, 
((select COUNT(*) from inward where item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid)-(select COUNT(*) from outward where item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid )) as TOTAL_AVAILABLE_STOCK, 
(select COUNT(*) from BLOCK where cast(dt_added as DATE)=CAST(GETDATE() as DATE)and item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid)as DAY_BLOCK_Stock, 
(select COUNT(*) from BLOCK where item_code=p.item_code) as TOTAL_BLOCK_Stock, 
p.cp_id, 
p.whLocId, 
p.COLOUR_ID 
from inward p 
left join outward out 
on p.item_code=out.item_code 
left join block blo 
on p.item_code=blo.item_code 
group by p.item_code,p.cp_id,p.colour_id,p.whlocid` 

看来这一个工作。但任何其他易升以及执行方法将是真正的帮助

回答

0
`SELECT 
p.ITEM_CODE as ITEM_CODE, 
(select COUNT(*) from inward where cast(dt_added as DATE)<>CAST(GETDATE() as DATE) and item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid )- (select COUNT(*) from outward where cast(dt_added as DATE)<>CAST(GETDATE() as DATE) and item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid)as Opening_Stock, 
(select COUNT(*) from inward where cast(dt_added as DATE)=CAST(GETDATE() as DATE) and item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid) as DAY_INWARD_Stock, 
(select COUNT(*) from inward where item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid) as 'TOTAL_INWARD_Stock', 
(select COUNT(*) from OUTWARD where cast(dt_added as DATE)=CAST(GETDATE() as DATE)and item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid) as DAY_OUTWARD_Stock, 
(select COUNT(*) from OUTWARD where item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid) as TOTAL_OUTWARD_Stock, 
((select COUNT(*) from inward where item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid)-(select COUNT(*) from outward where item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid )) as TOTAL_AVAILABLE_STOCK, 
(select COUNT(*) from BLOCK where cast(dt_added as DATE)=CAST(GETDATE() as DATE)and item_code=p.item_code and cp_id=p.cp_id and colour_id=p.colour_id and whlocid=p.whlocid)as DAY_BLOCK_Stock, 
(select COUNT(*) from BLOCK where item_code=p.item_code) as TOTAL_BLOCK_Stock, 
p.cp_id, 
p.whLocId, 
p.COLOUR_ID 
from inward p 

left join outward out 
on p.item_code=out.item_code 
left join block blo 
on p.item_code=blo.item_code 
group by p.item_code,p.cp_id,p.colour_id,p.whlocid` 
0

您的查询产生错误结果的原因是正在执行计数而不考虑您的加入条件。本节我们来看一看:

(select COUNT(*) from OUTWARD 
     where cast(dt_added as DATE)=CAST(GETDATE() as DATE)) as DAY_OUTWARD_Stock, 
(select COUNT(*) from OUTWARD) as TOTAL_OUTWARD_Stock, 

这不会是说“嘿,我需要确保我正确地映射到我的项目代码和颜色”,毕竟它怎么会知道,它的范围不没有达到主要查询。最重要的是,它甚至不选择这些变量。它只知道它的数量。那么,需要做些什么。

第1步:我们需要简化这个查询一下。真的不需要这些疯狂的选择。 Count会忽略空值,我们可以通过我们想要的ID正确地将事物分组在一起。

SELECT p.ITEM_CODE as ITEM_CODE, 
    COUNT(p.dt_added) as DAY_INWARD_Stock, 
    Null as 'TOTAL_INWARD_Stock', 
    COUNT(out.dt_added) as DAY_OUTWARD_Stock, 
    Null as TOTAL_OUTWARD_Stock, 
    COUNT(blo.dt_added) as DAY_BLOCK_Stock, 
    Null as TOTAL_BLOCK_Stock, 
    p.cp_id, 
    p.whLocId, 
    p.COLOUR_ID 
from inward p 
    left join outward out 
     on p.item_code=out.item_code 
    left join block blo 
     on p.item_code=blo.item_code 
where cast(p.dt_added as DATE) = CAST(GETDATE() as DATE) 
    Or (cast(out.dt_added as DATE) = CAST(GETDATE() as DATE) 
     Or out.dt_added Is Null) 
    Or (cast(blo.dt_added as DATE) = CAST(GETDATE() as DATE) 
     Or blo.dt_added Is Null) 
group by p.item_code,p.cp_id,p.colour_id,p.whlocid 

所以请注意,我已经删除了总数。这是为了确保查询的这一半有效。那么他们如何重新融入? 第2步:这是我们开始子查询的地方。我们通过添加3个连接来表示这些新表。此查询一半将是这样的:

SELECT p.ITEM_CODE as ITEM_CODE, 
    Null as DAY_INWARD_Stock, 
    pCount.pRecords as 'TOTAL_INWARD_Stock', 
    Null as DAY_OUTWARD_Stock, 
    outCount.outRecords as TOTAL_OUTWARD_Stock, 
    Null as DAY_BLOCK_Stock, 
    bloCount.bloRecords as TOTAL_BLOCK_Stock, 
    p.cp_id, 
    p.whLocId, 
    p.COLOUR_ID 
from inward p 
    left join (Select ITEM_CODE, Count(ITEM_CODE) As pRecords 
        from inward 
        group by ITEM_CODE) As pCount 
     on p.item_code = pCount.item_code 
    left join (Select inward.ITEM_CODE, Count(inward.ITEM_CODE) As outRecords 
        from inward 
         inner Join outward on inward.ITEM_CODE = outward.ITEM_CODE 
        group by ITEM_CODE) As outCount 
     on p.item_code = outCount.item_code 
    left join (Select inward.ITEM_CODE, Count(inward.ITEM_CODE) As bloRecords 
        from inward 
         inner Join block on inward.ITEM_CODE = block.ITEM_CODE 
        group by ITEM_CODE) As bloCount 
     on p.item_code = bloCount.item_code 

注:我迄今在什么我想你想实现基于这些方法。您可能会注意到计数按item_code分组。你也会注意到这些子查询中的内部连接。这一切都基于您希望这些按item_code分组的假设。如果你不这样做,这是一个不同的查询。另外一件重要的事情要注意,这实际上只是按item_code分组项目。我不知道你是否注意到这一点,但你的代码只假定color_id和其他参数是相同的。显然,如果这不是您的意图,则需要更改查询。无论如何,我们现在处于最后一步。

第3步:组合查询的时间。假设上述两个查询都会产生您期望的结果然后,将结果组合起来很简单。最后你的查询应该看起来像这样。

SELECT p.ITEM_CODE as ITEM_CODE, 
    COUNT(p.dt_added) as DAY_INWARD_Stock, 
    pCount.pRecords as 'TOTAL_INWARD_Stock', 
    COUNT(out.dt_added) as DAY_OUTWARD_Stock, 
    outCount.outRecords as TOTAL_OUTWARD_Stock, 
    COUNT(blo.dt_added) as DAY_BLOCK_Stock, 
    bloCount.bloRecords as TOTAL_BLOCK_Stock, 
    p.cp_id, 
    p.whLocId, 
    p.COLOUR_ID 
from inward p 
    left join outward out 
     on p.item_code=out.item_code 
    left join block blo 
     on p.item_code=blo.item_code 
    left join (Select ITEM_CODE As inItem_CDE, Count(ITEM_CODE) As pRecords 
        from inward 
        group by ITEM_CODE) As pCount 
     on p.item_code = pCount.inItem_CDE 
    left join (Select inward.ITEM_CODE As outItem_CDE, Count(inward.ITEM_CODE) As outRecords 
        from inward 
         inner Join outward on inward.ITEM_CODE = outward.ITEM_CODE 
        group by ITEM_CODE) As outCount 
     on p.item_code = outCount.outItem_CDE 
    left join (Select inward.ITEM_CODE As bloITEM_CDE, Count(inward.ITEM_CODE) As bloRecords 
        from inward 
         inner Join block on inward.ITEM_CODE = block.ITEM_CODE 
        group by ITEM_CODE) As bloCount 
     on p.item_code = bloCount.bloITEM_CDE 
where cast(p.dt_added as DATE) = CAST(GETDATE() as DATE) 
    Or (cast(out.dt_added as DATE) = CAST(GETDATE() as DATE) 
     Or out.dt_added Is Null) 
    Or (cast(blo.dt_added as DATE) = CAST(GETDATE() as DATE) 
     Or blo.dt_added Is Null) 
group by p.item_code,p.cp_id,p.colour_id,p.whlocid 

就是这样。希望所有的查询现在都是正确的,并给你你想要的结果。

+0

感谢 获得以下错误最后一个查询 消息209,级别16,状态1,行23 不明确的列名 'ITEM_CODE'。 消息209,级别16,状态1,行28 不明确的列名称“ITEM_CODE”。 我试图将其绑定到向内和pRecords但其不接受 消息8120,级别16,状态1,行20 ,因为它不是在聚合载列“inward.ITEM_CODE”在选择列表中无效函数或GROUP BY子句。 消息209,级别16,状态1,行28 不明确的列名称“ITEM_CODE”。 请建议。 – 2014-11-01 07:09:59

+0

@PradeepKumar对不起,没有得到更快。无论如何,代码现在应该工作。通过更改子查询中的ITEM_CODE名称来修复它。 – KHeaney 2014-11-03 13:49:18