2014-04-14 78 views
1

我必须尽快解决此问题,但我是Transact-SQL的新手。从现有视图创建视图

我有一个观点vStockSerialsTemp

Serial StockCode ActionPrice StockName  Warehouse ActionType 
    123 P-0304 350   Galaxy S4  Centeral Income 
    456 P-0305 450   Iphone 5s  Centeral Income 
    567 P-0305 450   Iphone 5s  Centeral Income 
    123 P-0304 350   Galaxy S4  Centeral Expense 
    235 P-0304 350   Galaxy S4  Centeral Income 
    567 P-0305 450   Iphone 5s  Centeral Expense 

因此,基于这种观点,我要创建一个新的观点,即会计算每只股票的具有相同序列号的平衡。我们用ActionType减去行数 来自ActionType Income的相同序列的费用。因此,视图应该如下所示:

Serial StockCode ActionPrice StockName  Warehouse ActionType 
    123 P-0304 350   Galaxy S4  Centeral Income 
    456 P-0305 450   Iphone 5s  Centeral Income 
    567 P-0305 450   Iphone 5s  Centeral Income 
    123 P-0304 350   Galaxy S4  Centeral Expense 
    235 P-0304 350   Galaxy S4  Centeral Income 
    567 P-0305 450   Iphone 5s  Centeral Expense 
    ----------------------------------------------------------------- 
    456 P-0305 450   Iphone 5s  Centeral Balance 
    235 P-0304 350   Galaxy S4  Centeral Balance 

CREATE vStockSerials as 
SELECT * FROM [dbo].[dbo.vStockSerialsTemp] 
UNION 
// Here is the problem indeed 

如何从vStockSerialsTemp这里选择行?

+0

你能告诉我们什么应该是你创建的新视图的最终输出? – Vasan

+1

我已经定义了最终的View,第二个! –

回答

1

我不知道这是否是最好的方法。但你可以这样做:

SELECT 
    vStockSerialsTemp.Serial, 
    vStockSerialsTemp.StockCode, 
    vStockSerialsTemp.ActionPrice, 
    vStockSerialsTemp.StockName, 
    vStockSerialsTemp.Warehouse, 
    vStockSerialsTemp.ActionType 
FROM 
    vStockSerialsTemp 
UNION 
SELECT 
    vStockSerialsTemp.Serial, 
    vStockSerialsTemp.StockCode, 
    vStockSerialsTemp.ActionPrice, 
    vStockSerialsTemp.StockName, 
    vStockSerialsTemp.Warehouse, 
    (
     CASE vStockSerialsTemp.ActionType 
     WHEN 'Income' 
     THEN 'Expense' 
     ELSE 'Income' 
     END 
    )AS ActionType 
FROM 
    vStockSerialsTemp 
1

就像三个产品进来(收入),两个花(费用)。收入 - 费用是剩余行(余额)...与此试试这个:

SELECT Serial, StockCode, ActionPrice, StockName, Warehouse 
FROM [dbo].[dbo.vStockSerialsTemp] Where ActionType = 'INCOME' 
EXCEPT 
SELECT Serial, StockCode, ActionPrice, StockName, Warehouse 
FROM [dbo].[dbo.vStockSerialsTemp] Where ActionType = 'EXPENSE' 

我希望它会工作。您可以应用计数。工会后

+0

'MINUS'是什么语言?而'收入'和'费用'必须是字符串。 – Arion

+0

MINUS适用于Oracle。 对于SQL Server我们应该使用EXCEPT。 感谢提问 – Sivaraman

+0

@FurkatKochkarow更正了。 – Sivaraman

1

事情是这样的打印并排谷歌的派生表或CTE计数的一面:

select a.Serial, a.StockCode, (a.ActionPrice - b.ActionPrice) as ActionPrice, 
a.StockName, a.Warehouse, 'Balance' as ActionType 
from [dbo].[dbo.vStockSerialsTemp] a 
inner join [dbo].[dbo.vStockSerialsTemp] b 
on a.Serial = b.Serial 
and a.ActionType = 'Income' 
and b.ActionType = 'Expense' 

加入相同的观点本身。一个与所有费用,另一个与所有收入。

1

根据您的预期结果,我假设您不想显示余额为零的连续剧数据。

SELECT 
    Serial, 
    StockCode, 
    ActionPrice, 
    StockName, 
    Warehouse, 
    ActionType 
FROM 
    vStockSerialsTemp 
UNION ALL 
SELECT 
    Serial, 
    StockCode, 
    sum(CASE WHEN ActionType = 'Income' THEN ActionPrice ELSE -ActionPrice END), 
    StockName, 
    Warehouse, 
    'Balance' 
FROM 
    vStockSerialsTemp 
GROUP BY 
    Serial, 
    StockCode, 
    StockName, 
    Warehouse 
HAVING 
    sum(CASE WHEN ActionType = 'Income' THEN ActionPrice ELSE -ActionPrice END) <> 0 
ORDER BY 
    ActionType DESC