我有以下查询哪个有效,但我还想确定每个产品(名称)的收入,这些产品根据分销中心的价格不同:
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等。
希望这是有道理的。
谢谢,
麦克
答案 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)?