SQL CASE产品价格

时间:2013-08-20 20:04:10

标签: sql-server tsql

我有以下查询哪个有效,但我还想确定每个产品(名称)的收入,这些产品根据分销中心的价格不同:

SELECT NAME, 
       ISNULL([UK - BOLTON], 0)   [UK Website], 
       ISNULL([USA - FLORIDA], 0) [USA Website], 
       ISNULL([CANADA], 0)        [Canada Website], 
       ISNULL([AUSTRALIA], 0)     [Australia Website], 
       ISNULL([AMAZON (USA)], 0)  [Amazon (USA)], 
       ISNULL([AMAZON (UK)], 0)   [Amazon (UK)], 
       ISNULL([AMAZON (FR)], 0)   [Amazon (FR)], 
       ISNULL([AMAZON (CA)], 0)   [Amazon (CA)], 
       ISNULL([AMAZON (JP)], 0)   [Amazon (JP)] 
FROM   (SELECT p.NAME, 
               ps.UNITSSOLD, 
               CASE 
                 WHEN dc.[DESCRIPTION] = 'UK Website' THEN p.UKWEBPRICE 
               END Revenue, 
               dc.[DESCRIPTION] 
        FROM   DBO.PRODUCTSALES ps 
               INNER JOIN DBO.PRODUCT p 
                       ON ps.PRODUCTID = p.PRODUCTID 
               INNER JOIN DBO.DISTRIBUTIONCENTRE dc 
                       ON ps.DISTRIBUTIONCENTREID = dc.DISTRIBUTIONCENTREID 
        WHERE  ps.ORDERDATE >= CONVERT(DATETIME, '2013-08-01 00:00:00', 102) 
               AND ps.ORDERDATE <= CONVERT(DATETIME, '2013-08-20 00:00:00', 102) 
               AND p.PRODUCTCLASSIFICATIONID = 2) [SourceTable] 
       PIVOT ( SUM(UNITSSOLD) 
             FOR [DESCRIPTION] IN ([UK - Bolton], 
                                   [USA - Florida], 
                                   [Canada], 
                                   [Australia], 
                                   [Amazon     (USA)], 
                                   [Amazon (UK)], 
                                   [Amazon (FR)], 
                                   [Amazon (CA)], 
                                   [Amazon (JP)]) ) AS PIVOTTABLE 

正如你所看到的,我尝试过使用CASE / WHEN,但我觉得我对如何做到这一点感到困惑。基本上英国 - 博尔顿应该从每个配送中心的产品表(p)等中获取UKWebpreice,并且它是收入,因此每个中心都有UnitsSold * UKWebPrice等。

希望这是有道理的。

谢谢,

麦克

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望添加几个代表每个配送中心收入的列 - 与销售的产品数量相同。 如果是这样,您需要更改您的收入定义并为另一个支点提供额外的描述列。

 ps.UnitSold * CASE WHEN dc.[DESCRIPTION] = 'UK Website' THEN p.UKWEBPRICE 
                 -- WHEN dc.[DESCRIPTION] = 'USA Website' then p.USAWEBPRICE
                 -- ...
 END Revenue, 
 'S'+dc.[DESCRIPTION]  as [RevenueDescription]

剩下的就是添加支点:sum(Revenue) for <values in [RevenueDescription]> 顶部查询中的列和销售额一样。

希望有所帮助 - 我无法访问Management Studio,因此无法检查查询是否100%正确。

PS。您可以考虑更改数据模型。在每个配送中心单独列出产品价格对我来说是一个坏主意 - 为什么不把它移到单独的表(product,distr_centre,price)?