2013-09-16 3 views
-1

У меня есть следующие 2 таблицы:Как рассчитать из 2 таблиц в SQL?

A (ID, No1, No2,D) 
B (ID, No3, No4,D) 

и табличные данные следующие:

Настольные данных

ID = 1, No1 = 23, No2 = 45, D = 1 
ID = 2, No1 = 12, No2 = 5, D = 1 
ID = 3, No1 = 14, No2 = 4, D = 1 
ID = 4, No1 = 41, No2 = 12, D = 1 
ID = 5, No1 = 2, No2 = 25, D = 1 
ID = 6, No1 = 3, No2 = 96, D = 1 

В таблице данных не любые данные

Если я прохожу Следующий SQL-запрос

SELECT 
    ISNULL(SUM(dbo.A.No1), 0) AS No1Sum, 
    ISNULL(SUM(dbo.B.No3), 0) AS No3Sum, 
    ISNULL(SUM(dbo.A.No1), 0) - ISNULL(SUM(dbo.B.No3), 0) AS Diffrence 
FROM dbo.A LEFT 
OUTER JOIN dbo.B ON dbo.A.id = dbo.B.id 
GROUP BY dbo.B.No3 

затем следующие данные грядут

No1Sum = 95, No3Sum = 0, Diffrence = 95 

Но когда я добавляю WHERE состояния и написать запрос, то никаких данных не поступают в следующем запросе

SELECT 
    ISNULL(SUM(dbo.A.No1), 0) AS No1Sum, 
    ISNULL(SUM(dbo.B.No3), 0) AS No3Sum, 
    ISNULL(SUM(dbo.A.No1), 0) - ISNULL(SUM(dbo.B.No3), 0) AS Diffrence 
FROM dbo.A 
LEFT OUTER JOIN dbo.B ON dbo.A.id = dbo.B.id 
WHERE (dbo.A.D = 1) 
AND (dbo.B.D = 1) GROUP BY dbo.B.No3 

Если данные будут precent в обеих таблицах, то результат будет показать, например

No1Sum = 95, No3Sum = 10, Diffrence = 85, 

Если я дам следующий запрос

SELECT 
    ISNULL(SUM(dbo.A.No1), 0) AS No1Sum, 
    ISNULL(SUM(dbo.B.No3), 0) AS No3Sum, 
    ISNULL(SUM(dbo.A.No1), 0) - ISNULL(SUM(dbo.B.No3), 0) AS Diffrence 
FROM dbo.A 
LEFT OUTER JOIN dbo.B 
    ON dbo.A.id = dbo.B.id 
    AND dbo.A.D = 1 
    AND dbo.B.D = 1 
GROUP BY dbo.B.No3 

затем следующий результат Показаны

No1Sum = 570, No3Sum = 0, Diffrence = 570 

(он подытоживает 6 раз таблицы имеет 6 строк)

Так как вычислить из обеих таблиц, когда данные в обеих таблицах результатом является точнее, но когда в таблице есть данные, а у B нет данных, результат не наступает.

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

+3

Каков ваш вопрос на самом деле? –

+0

Вы просто хотите суммировать таблицу B, если есть один ID в таблице? –

+0

Не могли бы вы уточнить свой вопрос, какие конкретные данные вы используете и какой конкретный результат вы ожидаете, пожалуйста? –

ответ

2

Причина этот запрос не работает, потому что это возвращает только запись, где dbo.b.d равно 1. Но в запросе он может иногда нуль.

SELECT 
    ISNULL(SUM(dbo.A.No1), 0) AS No1Sum, 
    ISNULL(SUM(dbo.B.No3), 0) AS No3Sum, 
    ISNULL(SUM(dbo.A.No1), 0) - ISNULL(SUM(dbo.B.No3), 0) AS Diffrence 
FROM 
     dbo.A LEFT OUTER JOIN dbo.B ON dbo.A.id = dbo.B.id 
WHERE 
     (dbo.A.D = 1) AND (dbo.B.D = 1) GROUP BY dbo.B.No3 

Так измените эту строку

(dbo.A.D = 1) AND (dbo.B.D = 1) GROUP BY dbo.B.No3 

Для этого

(dbo.A.D = 1) AND (isnull(dbo.B.D, 1) = 1) GROUP BY dbo.B.No3 

ISNULL (ARG, по умолчанию) устанавливается в ARG, если аргумент не является нулевым в противном случае она устанавливает его по умолчанию.

+5

Спасибо, его работа .... Еще один вопрос .. В моем вопросе я был добавлен только Одно условие на D = 1 ... Если хотите получить данные из обеих таблиц о двух условиях WHERE A.ID = 1 AND AD = 1 AND BD = 1 ... Как добавить это условие ..... –

+1

Если я правильно поймите, вы должны быть в состоянии сказать 'A.ID = 1 и dbo.AD = 1 AND (isnull (dbo.BD, 1) = 1)' – dcaswell

+5

Да, Моя основная проблема - это я хочу рассчитать из 2 таблицы. Таблица A как покупка и таблица B как продажа. В My Both 2 Tables есть условие Fix, что D будет 1 и некоторое время. Оно изменится на 2 или так далее, и я хочу использовать только те записи, где D равно 1 ... Теперь я хочу принять баланс Qty of My Продукт .. Когда я делаю покупки (ТАБЛИЦА A) и Dont имеют записи на продажу (в таблице B) Условие такое же ... Так что в соответствии с вашим ответом это woking .. Но так как я хочу рассчитать баланс, поэтому он будет зависеть от Id , Для примера A и B Id имеет продукт, поэтому я хочу разницу в этом. –

1

Я думаю, что это будет делать, даже если вторая таблица содержит данные.

SELECT ISNULL(SUM(A.No1), 0) AS No1Sum , 
      ISNULL(SUM(B.No3), 0) AS No3Sum , 
      ISNULL(SUM(A.No1), 0) - ISNULL(SUM(B.No3), 0) AS Diffrence 
    FROM A 
      LEFT OUTER JOIN B ON A.id = B.id 

SELECT 
    ISNULL(SUM(dbo.A.No1), 0) AS No1Sum, 
    ISNULL(SUM(dbo.B.No3), 0) AS No3Sum, 
    ISNULL(SUM(dbo.A.No1), 0) - ISNULL(SUM(dbo.B.No3), 0) AS Diffrence 
FROM dbo.A 
LEFT OUTER JOIN dbo.B ON dbo.A.id = dbo.B.id 
WHERE (dbo.A.D = 1) 
AND (dbo.B.D = 1) GROUP BY dbo.B.No3 

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

WHERE (dbo.A.D = 1) AND (dbo.B.D = 1)  

, и я думаю, что применение нескольких условий для присоединения является накладным.

LEFT OUTER JOIN dbo.B 
    ON dbo.A.id = dbo.B.id 
    AND dbo.A.D = 1 --Overhead 
    AND dbo.B.D = 1 --Overhead 
+5

Я также использовал это ;;; LEFT OUTER JOIN dbo.B ON dbo.A.id = dbo.B.id И dbo.AD = 1 --Рабочая головка И dbo.BD = 1 - Наверху –

+5

Например, в таблице представлено 6 строк и B В таблицах нет ни одной строки, она будет суммой 6 раз ..... Просьба прочитать последние 2 абзаца моего вопроса. Я уже был озаглавлен. –

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