2014-01-27 4 views
-1

у меня есть 3 таблицы, как это:SQL: Как разбить строку на несколько расчетных строк

ProductsTable 
--------------------------------------------- 
ProductID ProductName ProductDescription 
----------- -------------- ------------------ 
1   Name1   Description1 
2   Name2   Description2 

ValuesTable 
-------------------------------- 
ProductID Period   Value 
----------- -------------- ----- 
1   2014Q1   100 
1   2014Q2   110 
1   2014Q3   105 
2   2014Q1   80 
2   2014Q2   85 
2   2014Q3   90 

MonthsTable 
-------------------------------- 
Month  Period   Weeks 
----------- -------------- ----- 
2014-Jan 2014Q1   4 
2014-Feb 2014Q1   4 
2014-Mar 2014Q1   5 

То, что я хочу, это запрос, который может предоставить следующий результат:

ProductID  ProductName Month  Value 
1    Name1   2014-Jan 30.77 
1    Name1   2014-Feb 30.77 
1    Name1   2014-Mar 38.46 

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

=(PV/SWP * MW) 

где

  • PV: Период Значение
  • SWP: Сумма недель периода
  • MW: недели месяца

Спасибо заранее!

+0

пожалуйста маркировать свой вопрос с РСУБД и версии, которую вы используете (Oracle 11g, MySQL, SQL Server 2008, и т.д.) – Lamak

+0

Там не наблюдается никаких расщепление здесь. простое соединение с талбами приведет к появлению первых трех столбцов. Четвертый становится расчетным значением, используя введенную формулу. – xQbert

+3

Вопросы, требующие кода, должны продемонстрировать минимальные усилия. Пожалуйста, обновите свой вопрос с помощью кода, который вы попытались. – Kermit

ответ

1
SELECT p.productID, p.productName, m.month, (v.value/swp * m.weeks) 
FROM productsTable p, monthstable m, valuestable v, 
    (SELECT m1.period, sum(m1.weeks) as swp 
     FROM monthsTable m1 
     GROUP BY m1.period) x 
WHERE x.period = v.period AND p.productID = v.productID 
     --and p.productID = 1 --if you want the results only for product 1 

Другой способ будет использовать JOIN с (если я не ошибаюсь):

SELECT p.productID, p.productName, month, (v.value/x.swp * m.weeks) 
FROM productsTable p JOIN valuesTable v ON p.productID = v.productID 
    JOIN (SELECT m1.period, sum(m1.weeks) as swp 
      FROM monthsTable m1 
      GROUP BY m1.period) x ON x.period = v.period 
    JOIN monthsTable m ON x.period = m.period 

Вы только должны присоединиться все таблицы в соответствующее поле и вычислить последний столбец приложения непосредственно СВОЙ формула.

0

Предполагая, что SQL Server 2005+:

;WITH Months AS 
(
    SELECT *, 
      SUM(Weeks) OVER(PARTITION BY Period) QuarterWeeks 
    FROM MonthsTable 
) 
SELECT V.ProductID, 
     P.ProductName, 
     V.Value/M.QuarterWeeks * M.Weeks Value 
FROM ValuesTable V 
INNER JOIN ProductsTable P 
    ON V.ProductID = P.ProductID 
LEFT JOIN Months M 
    ON V.Period = M.Period 
+1

хорошо, если вы собираетесь делать 'SUM() OVER', зачем беспокоиться о CTE? например 'V.Value/SUM (Weeks) OVER (PARTITION by p.productID, v.Period) * M.Weeks Value' –

+0

@ConradFrix Почему бы и нет ?, Я нахожу этот синтаксис очень чистым и дает понять, что это такое, я пытаюсь сделать – Lamak

Смежные вопросы