Reputation: 199
I have a table like this:
i have a query like this:
SELECT T_BOE_Stock_Detail.itemCode,
T_Master_Item.itemName AS Description,
T_Master_Item.categoryCode AS Category,
sum(T_BOE_Stock_Detail.qty - T_BOE_Stock_Detail.ReservedQty) AS Qty
FROM T_BOE_Stock_Detail
LEFT OUTER JOIN T_Master_Item ON T_BOE_Stock_Detail.itemCode = T_Master_Item.itemCode
GROUP BY T_BOE_Stock_Detail.itemCode,
T_Master_Item.itemName,
T_Master_Item.categoryCode
HAVING sum(T_BOE_Stock_Detail.qty - T_BOE_Stock_Detail.ReservedQty) > 0
ORDER BY T_Master_Item.categoryCode,
T_BOE_Stock_Detail.itemCode
in the query i am getting out put like this:
itemcode description category qty
076-00002 bottom 2
in the same query i want to add two more column 1 is goodcount 2 is defectivecount ..
in the doctype column we have good and defective item.so i want to add count of that.
my expected out put like this:
itemcode description category qty good defective
076-00002 bottom 2 1 1
how i can achieve this?
Upvotes: 0
Views: 45
Reputation: 515
I Updated ans but I was not able to test it due to not having test data, can you please try this
Select T.itemCode,T.Description,T.Category,
SUM(CASE WHEN DOCTYPE = 'GOOD' THEN 1 ELSE 0 END) Good,
SUM(CASE WHEN DOCTYPE = 'DEFECTIVE' THEN 1 ELSE 0 END) Defective
from
(SELECT T_BOE_Stock_Detail.itemCode, T_Master_Item.itemName as Description,
T_Master_Item.categoryCode as Category,
SUM(T_BOE_Stock_Detail.qty - T_BOE_Stock_Detail.ReservedQty) As Qty,
FROM T_BOE_Stock_Detail
LEFT OUTER JOIN T_Master_Item ON T_BOE_Stock_Detail.itemCode = T_Master_Item.itemCode
GROUP BY T_BOE_Stock_Detail.itemCode, T_Master_Item.itemName,T_Master_Item.categoryCode
HAVING SUM(T_BOE_Stock_Detail.qty - T_BOE_Stock_Detail.ReservedQty) > 0
ORDER BY T_Master_Item.categoryCode, T_BOE_Stock_Detail.itemCode
) T
inner join T_BOE_Stock_Detail ON T_BOE_Stock_Detail.itemCode = T.itemCode
GROUP BY T.itemCode, T.Description,T.Category
Upvotes: 1
Reputation: 44326
Here is the full script, the performance has been improved a bit by aggregating before calculating:
SELECT BOE.itemCode,
M.itemName AS Description,
M.categoryCode AS Category,
sum(BOE.qty) - sum(BOE.ReservedQty) AS Qty,
count(case when DOCTYPE = 'GOOD' then 1 end) good,
count(case when DOCTYPE = 'DEFECTIVE' then 1 end) defective
FROM T_BOE_Stock_Detail BOE
LEFT OUTER JOIN
T_Master_Item M
ON BOE.itemCode = M.itemCode
GROUP BY BOE.itemCode,
M.itemName,
M.categoryCode
HAVING sum(BOE.qty) > sum(BOE.ReservedQty)
ORDER BY M.categoryCode,
BOE.itemCode
Not sure how to prefix DOCTYPE, you should use M or BOE in my example
Upvotes: 1
Reputation: 13700
Try this
select t_boe_stock_detail.itemcode, t_master_item.itemname as description,
t_master_item.categorycode as category,
sum(t_boe_stock_detail.qty - t_boe_stock_detail.reservedqty) as qty,
sum(case when doctype = 'good' then 1 end) as good,
sum(case when doctype = 'defective' then 1 end) as defective
from t_boe_stock_detail
left outer join t_master_item on t_boe_stock_detail.itemcode = t_master_item.itemcode
group by t_boe_stock_detail.itemcode, t_master_item.itemname,t_master_item.categorycode
having sum(t_boe_stock_detail.qty - t_boe_stock_detail.reservedqty) > 0
order by t_master_item.categorycode, t_boe_stock_detail.itemcode
Upvotes: 1
Reputation: 63742
You can use case
in the expression passed to sum
. So you can for example do something like this:
sum(case when DOCTYPE = 'GOOD' then 1 else 0 end)
Upvotes: 3