2014-03-26 87 views
1

的产品的最后一笔尽管我的SQL Server的小knwoledge,我对这个问题有一段时间stucked:SQL服务器 - 找两列

我想要得到的最后一笔两列的产品,但SQL Server不会识别我的最后一列。下面是该查询:

SELECT 
Products.customName AS 'Name', 
Ordered_Products.scanned AS 'Sent Quantity', 
Charged_Products.price AS 'Product Price', 
Ordered_Products.scanned * Charged_Products.price AS 'Charged' 
FROM Products 
    JOIN Charged_Products 
     ON Products.productsId = Charged_Products.productsId 
    JOIN Ordered_Products 
     ON Ordered_Products.productsId = Products.productsId 
WHERE 
Ordered_Products.ordersId = 500 AND 
Ordered_Products.scanned > 0 
UNION ALL 
SELECT 'TOTAL', '', '', SUM('Charged') 

它应该是这个样子:

有人能指出我在正确的方向,使查询工作?任何帮助将非常感激。

+3

我会更倾向于做SQL外部的,并且(即客户端代码中调用任何的查询计算。 NET,Java,SSRS等)。 –

回答

2

你可以这样来做:

SELECT 
Products.customName AS 'Name', 
Ordered_Products.scanned AS 'Sent Quantity', 
Charged_Products.price AS 'Product Price', 
Ordered_Products.scanned * Charged_Products.price AS 'Charged' 
FROM Products 
    JOIN Charged_Products 
     ON Products.productsId = Charged_Products.productsId 
    JOIN Ordered_Products 
     ON Ordered_Products.productsId = Products.productsId 
WHERE 
Ordered_Products.ordersId = 500 AND 
Ordered_Products.scanned > 0 

UNION ALL 

SELECT 'TOTAL', '', '', SUM(Ordered_Products.scanned * Charged_Products.price) 
FROM Products 
    JOIN Charged_Products 
     ON Products.productsId = Charged_Products.productsId 
    JOIN Ordered_Products 
     ON Ordered_Products.productsId = Products.productsId 
WHERE 
Ordered_Products.ordersId = 500 AND 
Ordered_Products.scanned > 0 
+1

这确实奏效,谢谢! –

2

GROUPING SETS是您可能需要的。检查这sql fiddle

此外,以下应该工作,但不是很确定,因为我没有与实际数据检查它。它的表现也不太好。

SELECT 
Products.customName AS 'Name', 
Ordered_Products.scanned AS 'Sent Quantity', 
Charged_Products.price AS 'Product Price', 
Ordered_Products.scanned * Charged_Products.price AS 'Charged' 
FROM Products 
JOIN Charged_Products 
ON Products.productsId = Charged_Products.productsId 
JOIN Ordered_Products 
ON Ordered_Products.productsId = Products.productsId 
WHERE 
Ordered_Products.ordersId = 500 AND 
Ordered_Products.scanned > 0 
UNION ALL 
SELECT 'TOTAL', '', '', SUM(Ordered_Products.scanned * Charged_Products.price) 
FROM Products 
JOIN Charged_Products 
ON Products.productsId = Charged_Products.productsId 
JOIN Ordered_Products 
ON Ordered_Products.productsId = Products.productsId 
WHERE 
Ordered_Products.ordersId = 500 AND 
Ordered_Products.scanned > 0 

希望这会有所帮助。

+0

谢谢,即使它的表现有点贪婪,正如你所说的那样! –

3

你最好在客户端做到这一点。

但是,如果你想这么多,然后使用GROUPING SETS

SELECT ISNULL (Products.customName, 'TOTAL') AS 'Name' 
    , Ordered_Products.scanned AS 'Sent Quantity' 
    , Charged_Products.price AS 'Product Price' 
    , SUM (Ordered_Products.scanned * Charged_Products.price) AS 'Charged' 
FROM Products 
INNER JOIN Charged_Products ON Products.productsId = Charged_Products.productsId 
INNER JOIN Ordered_Products ON Ordered_Products.productsId = Products.productsId 
WHERE Ordered_Products.ordersId = 500 
    AND Ordered_Products.scanned > 0 
GROUP BY GROUPING SETS ((Products.customName, Ordered_Products.scanned, Charged_Products.price),()) 
+0

我尝试使用GROUPING SETS,但它似乎没有检索到正确的结果。我将坚持答案的方式。肯定会更贪婪,但因为我不需要处理大量数据,所以应该这样做。无论如何,感谢您的帮助! –

0
DECLARE @TableName TABLE 
    ([name] varchar(20), [attribute] INT, [value] int) 
; 

INSERT INTO @TableName 
    ([name], [attribute], [value]) 
VALUES 
    ('Product1', 2, 15), 
    ('Product2', 3, 30), 
    ('Product3', 3, 20) 

select name,attribute,value,attribute * value As Total from @TableName 
UNION ALL 
Select 'T0tal','','',SUM(attribute * value) from @TableName