SQL Server - 获取两列产品的最终总和

时间:2014-03-26 09:57:57

标签: sql .net sql-server vb.net

尽管我对SQL Server知之甚少,但我仍然坚持这个问题一段时间:

我正在尝试获取两列产品的最终总和,但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')

看起来应该是这样的:

有人能指出我正确的方向让查询有效吗?任何帮助将不胜感激。

4 个答案:

答案 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),())

答案 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

希望这有帮助。

答案 2 :(得分: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

答案 3 :(得分: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