我想知道是否有人可以幫助我解決這個產品百分比細分挑戰。
我有以下代碼將資料插入表中。
DROP TABLE IF EXISTS #ProductBreakdown
CREATE TABLE #ProductBreakdown
(
Product VARCHAR(20)
, [TotalSales] decimal(20, 2)
, Percentage decimal(20, 2)
)
;
INSERT INTO #ProductBreakdown VALUES('Product A', 596.42, 0)
INSERT INTO #ProductBreakdown VALUES('Product A', 127.55, 0)
INSERT INTO #ProductBreakdown VALUES('Product A', 736.83, 0)
INSERT INTO #ProductBreakdown VALUES('Product B', 379.51, 0)
INSERT INTO #ProductBreakdown VALUES('Product B', 205.95, 0)
INSERT INTO #ProductBreakdown VALUES('Product C', 905.99, 0)
此 SELECT 查詢回傳正確的百分比結果,即
SELECT PB.Product, PB.TotalSales,
[TotalSales] / SUM([TotalSales]) OVER(PARTITION BY Product) * 100 AS PercentageSales
FROM #ProductBreakdown PB
| 產品 | 總銷售額 | 百分比銷售額 |
|---|---|---|
| 產品A | 596.42 | 40.83 |
| 產品A | 127.55 | 8.73 |
| 產品A | 736.83 | 50.44 |
| 產品B | 379.51 | 64.82 |
| 產品B | 205.95 | 35.18 |
| 產品C | 905.99 | 100.00 |
我現在想使用 UPDATE 陳述句將這些百分比提交到表中。我正在使用以下陳述句
UPDATE #ProductBreakdown SET [Percentage] =
(SELECT
[TotalSales] / SUM([TotalSales]) OVER(PARTITION BY Product) * 100 AS PercentageSales
FROM #ProductBreakdown PB2 WHERE PB1.Product = PB2.Product AND PB1.TotalSales = PB2.TotalSales)
FROM #ProductBreakdown PB1
SELECT * FROM #ProductBreakdown
但是,這將為每一行回傳 100%。
有人對我哪里/哪里出錯有任何建議嗎?
uj5u.com熱心網友回復:
您犯的錯誤是您也關聯了TotalSales子查詢中的列,而不僅僅是Product.
但是您可以更新 CTE 或派生表,而無需連接或重新掃描基表
UPDATE pb
SET Percentage = pb.PercentageSales
FROM (
SELECT *,
pb.TotalSales / SUM(pb.TotalSales) OVER (PARTITION BY pb.Product) * 100 AS PercentageSales
FROM #ProductBreakdown pb
) pb;
但是我建議您無論如何都使用視圖來代替,否則您必須使其與觸發器保持同步。
uj5u.com熱心網友回復:
您可以將計算包含在 CTE 中并簡單地更新它:
with updateme as (
select *,
TotalSales / Sum(TotalSales) over(partition by Product) * 100 as PercentageSales
from #ProductBreakdown
)
update updateme set Percentage = PercentageSales;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/443356.html
標籤:sql sql服务器 tsql sql-server-2016 百分比
