Обновить таблицу, чтобы включить рассчитанный процент - PullRequest
0 голосов
/ 05 июля 2018

У меня есть следующая упрощенная таблица:

╔══════════╦═══════════╗═══════════╗═══════════╗
║ Dough    ║ Material  ║ PerCharge ║ Perc      ║
╠══════════╬═══════════╣═══════════╣═══════════╣
║ DG10001  ║ GR002152  ║ 2,00      ║           ║ 
║ DG10001  ║ GR000133  ║ 9,00      ║           ║ 
║ DG10001  ║ GR000133  ║ 9,00      ║           ║ 
║ DG10002  ║ GR002152  ║ 2,50      ║           ║ 
╚══════════╩═══════════╝═══════════╝═══════════╝

Тесто-материал - это отношение один ко многим, PerCharge - это вес сырья, используемого в контейнере.

Я хочу рассчитать процент для каждой отдельной строки на основе общего количества, использованного для каждого уникального теста.

Я использовал следующее, чтобы вычислить процент

SELECT D.Dough
       ,Material
       ,PerCharge
       ,PerCharge/Total as Percentage
  FROM 
(Select Dough
       ,sum(PerCharge) as Total
From [PP_Materials].[dbo].[Deegregels]

group by Dough
) as D

left join

(SELECT Dough
      ,Material
     ,PerCharge
FROM [PP_Materials].[dbo].[Deegregels]
) as D2
On D.Dough = D2.Dough

order by D.Dough

Теперь мне нужно только обновить исходную таблицу, чтобы включить этот рассчитанный процент, но я не могу понять, как сформулировать оператор обновления.

Любая помощь, которую вы можете оказать, приветствуется.

РЕДАКТИРОВАТЬ: Результат для упрощенного примера

╔══════════╦═══════════╗═══════════╗═══════════╗
║ Dough    ║ Material  ║ PerCharge ║ Perc      ║
╠══════════╬═══════════╣═══════════╣═══════════╣
║ DG10001  ║ GR002152  ║ 2,00      ║     10%   ║ 
║ DG10001  ║ GR000133  ║ 9,00      ║     45%   ║ 
║ DG10001  ║ GR000133  ║ 9,00      ║     45%   ║ 
║ DG10002  ║ GR002152  ║ 2,50      ║     10%   ║ 
╚══════════╩═══════════╝═══════════╝═══════════╝

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Вы также можете обернуть его в cte

with updatestatement as  (SELECT D.Dough
       ,Material
       ,PerCharge
       ,PerCharge/Total as Percentage
  FROM 
(Select Dough
       ,sum(PerCharge) as Total
From [dbo].[Deegregels]

group by Dough
) as D

left join

(SELECT Dough
      ,Material
     ,PerCharge
FROM [dbo].[Deegregels]
) as D2
On D.Dough = D2.Dough
)

update b
set perc = a.percentage

from updatestatement a inner join dbo.[Deegregels] b on a.dough = b.dough and a.material = b.material
0 голосов
/ 05 июля 2018

Гораздо более краткая версия:

USE Sandbox;
GO
--Create sample table and data
CREATE TABLE #Dough (Dough varchar(10),
                     Material varchar(10),
                     PerCharge decimal(5,2),
                     Perc decimal(3,2));

INSERT INTO #Dough (Dough,
                    Material,
                    PerCharge)
VALUES ('DG10001','GR002152',2.00), 
       ('DG10001','GR000133',9.00), 
       ('DG10001','GR000133',9.00), 
       ('DG10002','GR002152',2.50);
GO
--The solution

WITH CTE AS(
    SELECT D.Dough, D.Material, D.PerCharge, Perc,
           PerCharge / SUM(PerCharge) OVER (PARTITION BY Dough) AS NewPerc
    FROM #Dough D)
UPDATE CTE
SET Perc = NewPerc
GO
--Check the data
SELECT *
FROM #Dough
GO
--Clean up
DROP TABLE #Dough;

Нет необходимости дважды сканировать таблицу, когда вы можете использовать функцию окна.

0 голосов
/ 05 июля 2018

Вы должны попробовать это:

CREATE TABLE #Dough
(
    Dough VARCHAR(10) NULL,
    PerCharge DECIMAL(10,2) NULL,
    [Percentage] DECIMAL(10,2) NULL
)

INSERT INTO #Dough
VALUES
('DG10001',2,NULL),('DG10001',9,NULL),('DG10001',9,NULL),('DG10002',2,NULL)

SELECT *
FROM #Dough

;WITH Total AS
(
    SELECT   Dough
            ,Total = SUM(PerCharge)
    FROM #Dough
    GROUP BY Dough
)
UPDATE D1
SET [Percentage] = D1.PerCharge/T1.Total
FROM #Dough D1
JOIN Total  T1 ON D1.Dough = T1.Dough
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...