如何在列中选择不同的值,然后显示派生列的总数?

时间:2019-05-10 13:23:59

标签: sql-server tsql

对于一项家庭作业,我需要编写一个查询,以显示不同类型的库存(咖啡,茶或NULL)及其总价值(库存*价格)的总和,因此它应该是3x2的表格查询运行。完整的问题是:“创建一个名为CoffeeTotal.sql的新查询,该查询将汇总每种商品类型(咖啡和茶)的价格。使用CASE语句并按商品类型显示结果。将“总价值”转换为一个“ $”。“

我知道输出应该是:

Coffee | $1242571.75
Tea    | $211716.70
NULL   | $1455288.45

但是我正在努力编写查询。目前,我的尝试是:

SELECT DISTINCT ItemType AS "Product Type",
    SUM(CASE WHEN ItemType = 'Coffee' THEN Price*OnHand),
    SUM(CASE WHEN ItemType = 'Tea' THEN Price*OnHand),
    SUM(CASE WHEN ISNULL(ItemType) THEN Price*OnHand)
FROM Inventory

但是我100%确信此代码是错误的,此时我完全不知道如何添加'$'。预先谢谢你。

1 个答案:

答案 0 :(得分:1)

一种可能的方法,将GROUP BYCASEFORMAT()函数一起使用(如果使用SQL Server 2012 +):

输入:

CREATE TABLE #Inventory (
    ItemType varchar(10),
    Price numeric(10, 2),
    OnHand int
)
INSERT INTO #Inventory
    (ItemType, Price, OnHand)
VALUES
    ('Coffee', 1.02, 21),
    ('Coffee', 1.02, 22),
    ('Coffee', 1.02, 23),
    ('Coffee', 1.02, 24),
    ('Tea', 2.01, 11),
    ('Tea', 2.01, 12),
    ('Drink', 3.03, 1),
    (NULL, 13.13, 3)

T-SQL:

SELECT 
    CASE 
        WHEN ItemType <> 'Coffee' AND ItemType <> 'Tea' THEN NULL
        ELSE ItemType
    END AS ItemType,
    FORMAT(SUM(Price * OnHand), '$0.00') AS Total
FROM #Inventory
GROUP BY 
    CASE 
        WHEN ItemType <> 'Coffee' AND ItemType <> 'Tea' THEN NULL
        ELSE ItemType
    END

输出:

ItemType    Total
NULL        $42,42
Coffee      $91,80
Tea         $46,23