2013-11-08 3 views
0

У меня есть следующие таблицы -SQL возвращения дубликатами

Timelogs

ID 
UserID 
JobID 
TimeTaken 
JobPhase 

MaterialsForJob

ID 
StockID 
JobID 
UserID 
Quantity 

Сток

ID 
Name 
CostPrice 

Следующий запрос возвращает повторяющиеся строки, поскольку для задания задано более одного элемента запаса и более одной фазы (tl.Phase). Мой вопрос: как я могу вернуть только 1 строку с суммой? Добавляя SUM() в его нынешнем виде, возвращаемые значения будут неправильными.

SELECT 
    TimeTaken as 'HoursSold', s.CostPrice * mfj.Quantity as 'StockCost' 
FROM 
    TimeLogs tl 
LEFT JOIN 
    MaterialsForJob mfj ON mfj.JobID = tl.JobID AND mfj.UserID = tl.UserID 
INNER JOIN 
    Stock s ON s.ID = mfj.StockID 
WHERE 
    tl.UserID = 10000 AND 
    tl.DateEntry BETWEEN DATEADD(wk, DATEDIFF(wk, 0, '11/07/2013'), 0) 
        AND DATEADD(wk, DATEDIFF(wk, 0, '11/07/2013'), 6) 

На данный момент, выше запрос возвращает -

Screenshot of invalid data

Однако, он должен показать -

19570633502 - 30.00 

Надеется, что это имеет смысл. Спасибо

+0

Является ли '' mfj.UserID' 'отсутствующим в определениях таблиц? – acfrancis

+0

Да, извините. Добавлено в MaterialForJob – dynamicuser

ответ

3

Попробуйте этот запрос с SUM и DISTINCT. Это должно привести к правильному результату:

SELECT t1.JobID AS JID, SUM(DISTINCT(TimeTaken)) as 'HoursSold', SUM(DISTINCT(s.CostPrice * mfj.Quantity)) as 'TotalStockCost' 
FROM TimeLogs tl 
LEFT JOIN MaterialsForJob mfj on mfj.JobID = tl.JobID and mfj.UserID = tl.UserID 
INNER JOIN Stock s on s.ID = mfj.StockID 
WHERE 
    tl.UserID = 10000 and 
    tl.DateEntry between dateadd(wk, datediff(wk,0,'11/07/2013'), 0) and 
    dateadd(wk, datediff(wk,0,'11/07/2013'), 6) 
GROUP BY JID 
+0

Этот вид работ. Он возвращает 2 строки, по одному для каждого tl.PhaseID. Стоимость запасов правильна для обеих строк. Однако в идеале HoursSold также должен быть SUM(), поэтому есть одна строка. – dynamicuser

+0

Значение HoursSold теперь корректно, но TotalStockCost составляет 60 фунтов стерлингов. Это должно быть 30 фунтов стерлингов. Запасы присваиваются заданию, которое имеет несколько фаз (из которых в этом случае 2), следовательно, почему это 60 фунтов стерлингов. Не знаете, как решить эту проблему! Cheers – dynamicuser

+0

Решено выше, добавив - SUM (DISTINCT (s.CostPrice * mfj.Quantity)). – dynamicuser

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