2015-05-16 3 views
0

Ниже приведен SQL-запрос, который дает неверные результаты.Неправильный результат при соединении двух таблиц

Select ASXCode.Stock_Code, Count(Bought.Number_Bought) as Transactions, 
     SUM(Bought.Number_Bought) as Bought, 
     SUM(Bought.Total_Cost)/SUM(Bought.Number_Bought) AS Average_Price, 
     SUM(Bought.Acc_Interest) as Interest, 
     SUM(Income.Total_Income)/COUNT(Bought.Number_Bought) as Derived_Income, 
     Sum(Bought.Total_Cost + Bought.Acc_Interest + Income.Neg_Total_Income)/SUM(Bought.Number_Bought) as Breakeven 
FROM 
    ASXCode 
    LEFT JOIN 
    Bought ON Bought.Stockid = ASXCode.Stockid 
    LEFT JOIN 
    Income ON ASXCode.Stockid = Income.Incomeid 
GROUP BY 
    ASXCode.Stock_Code 

Приведенные выше результаты SQL запроса в DataGridView следующим образом:

Stock_Code|Transactions|Bought|Average_Price|Interest|Derived_Income| Breakeven 
     ASL   2  10000  0.45  15.00                   
     RCR   2  5000  1.90  55.35 
     SKE   6  20000  1.27  148.97 1071.43  0.96 

Есть две проблемы с этой таблицей. Общий доход был умножен на количество транзакций при расчете цены безубыточности. Правильная цена безубыточности составляет около 1,22. Эта часть запроса может быть исправлена, если я могу добавить «делить на сумму COUNT Number_Rows». Однако я не смог включить это в запрос. Во-вторых, поскольку нет дохода для двух других холдингов, поля дохода равны Null, и я думаю, что это делает невозможным рассчитать цену безубыточности. Я думал, что эта проблема может быть решена путем включения в запрос «где доход не равен нулю». Однако, несмотря на различные попытки включить такое заявление в запрос, я нарисовал пробел. Мне очень хотелось бы думать, что есть решение моих проблем.

+0

Посмотрите на то, что запрос возвращает без заполнителей и группы. – JimmyB

+0

Кроме того, присоединяется к штоку на доход, на самом деле то, что вы хотите? Каковы мощности? - Добавьте небольшой образец данных. – JimmyB

+0

Я думаю, что я мог бы предложить лучшее решение, если бы знал схему Дохода, но я угадаю, что для данного товара есть одна позиция, правильно? если это так, создайте CTE с тем же запросом, но исключите ссылки на «Доход». Затем присоединитесь к CTE к Доходу. Это решит первую проблему. – Greg

ответ

0

Я думаю, ваша проблема исходит от того, где у вас есть основная таблица и две детали таблицы вроде этого:

[ Bought ] *-------1 [ ASXCode ] 1-------* [ Income ] 

Так что, когда вам нужен результат база на ASXCode и подробная на Bought без перехода к Income и наоборот; Вам нужен запрос, как это:

SELECT * 
FROM ASXCode AS A 
    LEFT OUTER JOIN 
    (SELECT * 
    FROM Bought 
    GROUP BY *) AS B ON A.PK = B.FK 
    LEFT OUTER JOIN 
    (SELECT * 
    FROM Income 
    GROUP BY *) AS I ON A.PK = I.FK 

Итак, для вас, я думаю, что этот вопрос должен работать правильно:

SELECT 
    A.Stock_Code, 
    B.Count_Number_Bought as Transactions, 
    B.SUM_Number_Bought as Bought, 
    B.SUM_Total_Cost/B.SUM_Number_Bought AS Average_Price, 
    B.SUM_Acc_Interest as Interest, 
    I.SUM_Total_Income/B.Count_Number_Bought as Derived_Income, 
    (B.SUM_Total_Cost + B.SUM_Acc_Interest + I.SUM_Neg_Total_Income)/B.SUM_Number_Bought as Breakeven 
FROM 
    ASXCode AS A 
    LEFT JOIN 
    (SELECT 
     Bought.Stockid, 
     COUNT(Bought.Number_Bought) As COUNT_Number_Bought, 
     SUM(Bought.Number_Bought) AS SUM_Number_Bought, 
     SUM(Bought.Total_Cost) AS SUM_Total_Cost, 
     SUM(Bought.Acc_Interest) AS SUM_Acc_Interest 
    FROM 
     Bought 
    GROUP BY 
     Bought.Stockid) AS B ON B.Stockid = A.Stockid 
    LEFT JOIN 
    (SELECT 
     Income.Stockid, 
     SUM(Income.Total_Income) AS SUM_Total_Income, 
     SUM(Income.Neg_Total_Income) AS SUM_Neg_Total_Income 
    FROM 
     Income 
    GROUP BY 
     Income.Stockid) AS I ON A.Stockid = I.Stockid 
+0

shAt спасибо за информацию. Вы правильно знаете структуру базы данных. Тем не менее, ваш комментарий к «Доходу FK» подчеркнул (я думаю), что в моей базе данных произошла ошибка. Теперь мне интересно, неправильно ли названы мои FK? Я загрузил схему своей базы данных на https://www.flickr.com/photos/[email protected]/ – Johnkg

+0

@Johnkg. Я редактирую свой запрос в качестве вашей схемы, надеюсь, он даст вам правильный результат;). –

+0

shAt, я забыл упомянуть, что я не смог заставить ваш запрос запускаться и получил сообщение «Неправильный синтаксис рядом с ключевым словом« ON »:« именно это и заставило меня поверить, что проблема связана с моей базой данных. – Johnkg

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