2015-03-12 2 views
0

мой первый столДругие проблемы запроса

type   days  application 
------------------------------- 
sick   10   leave 
vacation  10   leave 
PSCS   0   Seminar 

мой второй стол

person    type   UseDays 
----------------------------------------- 
chuck norris  vacation    1 
chuck norris  PSCS     0 
bruce lee   sick     5 

и я хочу присоединиться к them..but я хочу, чтобы просмотреть только «отпуск» в применении в 1-ом поле таблицы

ex. я выбираю Chuck Norris

type   days   UseDays 
------------------------------------ 
sick   10     0 
vacation  10     1 

вот что я уже done..but до сих пор не может получить правильную вещь ..

SELECT  LeavetypTbl.Id, LeavetypTbl.type , LeavetypTbl.days, ISNULL(SUM(LeaveTbl.UseDays), 0) AS Expr1, LeavetypTbl.days- ISNULL(SUM(LeaveTbl.UseDays), 0) as LeftX " & _ 
FROM  LeavetypTbl " & _ 
LEFT OUTER JOIN " & _ 
LeaveTbl " & _ 
ON   LeavetypTbl.type = LeaveTbl.type And LeaveTbl.IDno = '" & id & "' and LeaveTbl.Application <> 'Seminar'" & _ 
GROUP BY LeavetypTbl.type , LeavetypTbl.days, LeavetypTbl.Id" 

и результат ... все равно будет показывать все тип приложения. .

+0

Извините, что вам не пришло в голову .. –

+0

Просьба указать, каков ваш ожидаемый результат, немного непонятно, учитывая ваш пример с выбором chuck norris (не знаю, откуда начинается первый ряд) –

ответ

2

Выполнять меньшие шаги. Начнем с типов, которые вы хотите отобразить. Давайте отфильтровать их на leave. Давайте назовем этот результат A:

type   days  application 
------------------------------- 
sick   10   leave 
vacation  10   leave 

Теперь давайте посмотрим на второй стол и фильтровать его на соответствующее лицо:

person    type   UseDays 
----------------------------------------- 
chuck norris  vacation    1 
chuck norris  PSCS     0 

Теперь мы суммируем UseDays, так как там может быть много отпусков. Результат выглядит очень похоже. Давайте назовем это B:

person    type  SumOfUseDays 
----------------------------------------- 
chuck norris  vacation    1 
chuck norris  PSCS     0 

Вы знаете, как добраться до этой точки, не так ли? Теперь давайте примем участие A и B на type (SELECT ... FROM (...select-for-a...) AS A LEFT JOIN (...select-for-b...) AS B ON A.type = B.type). Убедитесь в том, чтобы использовать LEFT JOIN, так как мы хотим, чтобы все записи из A, даже если записи в B не существует:

type   days  application person  SumOfUseDays 
------------------------------------------------------- 
sick   10   leave  NULL    NULL 
vacation  10   leave  chuck norris  1 

Нам не нужен столбец человек, так что мы просто бросить его. Мы до сих пор в SumOfUseDays это некрасиво NULL, так что мы просто COALESCE или IsNull результат 0:

type   days  application SumOfUseDays 
------------------------------------------------- 
sick   10   leave    0 
vacation  10   leave    1 

И мы. Реализация остается упражнением, но не стесняйтесь спросить, застряли ли вы на определенном шаге.

+0

вот что я сделал .. но все-таки я получаю все типы приложений. В результате я хочу получить только «отпуск» в поле приложения ... SELECT LeavetypTbl.Person, LeavetypTbl.Leave, LeavetypTbl.Days, ISNULL (SUM (LeaveTbl.UseDays), 0) AS expr1, LeavetypTbl.Days - ISNULL (SUM (LeaveTbl.UseDays), 0), как LeftX ОТ LeavetypTbl LEFT OUTER JOIN LeaveTbl пО LeavetypTbl.Leave = LeaveTbl.Leave И LeaveTbl.IDno = 'Чак Норрис' и LeaveTbl.A pplication = 'Leave' GROUP BY LeavetypTbl.Leave, LeavetypTbl.Days, LeavetypTbl.Person –

+0

@yoyieyoyie: Да, я знаю, вы уже писали это в своем вопросе. Вы попробовали поэтапный подход, который я предложил? Как далеко вы добрались? – Heinzi

+0

это право ??? SELECT LeavetypTbl.Leave, LeavetypTbl.Counter, LeavetypTbl.Id FROM (SELECT LeavetypTbl.Leave От LeavetypTbl Где приложение = «Оставить») в качестве Atbl LEFT OUTER JOIN (SELECT leaveTbl.id from LeaveTbl Где ISNULL (SUM (LeaveTbl.Numdays), 0)), и я не могу продолжить. .i'm запутать в этой части .. B ON A.type = B.type –

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