2017-01-13 4 views
0

Я работаю над проектом diagonistic bill centre management, где пользователь будет выбирать дату и дату, затем весь тестовый список отобразит с указанием номера запроса и общей стоимости заявки были ли эти испытания запрошены или нет между этим конкретным диапазоном дат. Если какой-либо конкретный тест не запрашивался между этим диапазоном дат, тогда для этого запроса на тестирование нет и плата будет равна нулю, когда я укажу диапазон дат только тех, которые были указаны в запросе, а не весь список тестов, может кто-нибудь помочь, пожалуйста, как также показать нулевые значения с диапазоном дат, я использовал полное внешнее соединение тоже, но не работаеткак показать все значения, включая null при использовании диапазона

результат должен быть, как это, это без диапазона

results

обновленный результат

updated result

Обновлено решается запрос

Updated solved query

+1

Я собираюсь сделать предположение, что вы добавляете дату ограничения как ИНЕКЕ, когда вы должны добавить его в LEFT JOIN в TestRequestTestName вместо этого? Когда у вас есть LEFT JOIN, но затем добавьте условие в предложение WHERE, которое зависит от значений в таблице, которую вы используете OUTER JOINING, тогда вы фактически создаете INNER JOIN. –

+0

Спасибо за ваш ответ. Scsimon.i попытались использовать предложение where с предложением LeftRequestTestName left join, но только запрошенные тесты показали. Я решил проблему, должен добавить или RequestDate имеет значение null между диапазоном.i обновил запрос, спасибо :) –

ответ

0

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

DECLARE @testType TABLE( 
TestID INT, 
TestName varchar(128) 

)

DECLARE @testRequest TABLE( 
TestRequestID INT, 
TestID INT, 
TestCost INT, 
TestDate DATETIME 

)

INSERT INTO @testType (TestID,TestName) VALUES (1, 'Bone'); 
INSERT INTO @testType (TestID,TestName) VALUES (2, 'Chest'); 
INSERT INTO @testType (TestID,TestName) VALUES (3, 'Head'); 
INSERT INTO @testType (TestID,TestName) VALUES (4, 'Infection'); 

INSERT INTO @testRequest (TestRequestID, TestID, TestCost, TestDate) VALUES (1, 1, 10, GETDATE()) 
INSERT INTO @testRequest (TestRequestID, TestID, TestCost, TestDate) VALUES (2, 1, 10, GETDATE()) 
INSERT INTO @testRequest (TestRequestID, TestID, TestCost, TestDate) VALUES (3, 2, 20, GETDATE()) 
INSERT INTO @testRequest (TestRequestID, TestID, TestCost, TestDate) VALUES (4, 2, 20, GETDATE()) 


SELECT 
TT.TestName, 
COUNT(TR.TestRequestID) [TestCount], 
ISNULL(SUM(TR.TestCost),0) [TotalCost] 
FROM @testType TT 
LEFT JOIN @testRequest TR ON TT.TestID = TR.TestID 
AND TR.TestDate BETWEEN GETDATE() AND GETDATE() 
GROUP BY TT.TestName; 
+0

Nanuz Спасибо за ваш ответ, я попробовал ваш запрос раньше, но результат был таким же, только те, которые были запрошены, показывают, не все тесты, однако я решил его, я должен добавить или requestdate имеет значение null с датой диапазон, то все тесты показывают, запрашиваются ли они или нет с их соответствующей косой просьбой и нет запроса. Я обновил запрос. Спасибо :) –

+0

Я думаю, что вы должны повторить мой запрос, он возвращает все тесты. Единицы со значениями и значениями с нулями. – Nanuz

0

Вот еще один вариант ниже кода с результатами и больше испытаний.

DECLARE @testType TABLE( 
TestID INT, 
TestName varchar(128) 
) 

DECLARE @testRequest TABLE( 
TestRequestID INT, 
TestID INT, 
TestCost INT, 
TestDate DATETIME 
) 

INSERT INTO @testType (TestID,TestName) VALUES (1, 'Bone'); 
INSERT INTO @testType (TestID,TestName) VALUES (2, 'Chest'); 
-- These 2 test will no get a match and will be null 
INSERT INTO @testType (TestID,TestName) VALUES (3, 'Head'); 
INSERT INTO @testType (TestID,TestName) VALUES (4, 'Infection'); 
INSERT INTO @testType (TestID,TestName) VALUES (5, 'Leg'); 

INSERT INTO @testRequest (TestRequestID, TestID, TestCost, TestDate) VALUES (1, 1, 10, GETDATE()) 
INSERT INTO @testRequest (TestRequestID, TestID, TestCost, TestDate) VALUES (2, 1, 10, GETDATE()) 
INSERT INTO @testRequest (TestRequestID, TestID, TestCost, TestDate) VALUES (3, 2, 20, GETDATE()) 
INSERT INTO @testRequest (TestRequestID, TestID, TestCost, TestDate) VALUES (4, 2, 20, GETDATE()) 
INSERT INTO @testRequest (TestRequestID, TestID, TestCost, TestDate) VALUES (4, 2, 20, GETDATE()) 
INSERT INTO @testRequest (TestRequestID, TestID, TestCost, TestDate) VALUES (4, 2, 20, GETDATE()) 

-- TestID 3 will get a 1 match here 
INSERT INTO @testRequest (TestRequestID, TestID, TestCost, TestDate) VALUES (4, 3, 50, GETDATE()) 

-- TestID 3 will not get a match b/c of the date 
INSERT INTO @testRequest (TestRequestID, TestID, TestCost, TestDate) VALUES (4, 3, 50, '2015-01-01') 

-- TestID 4 will not get a match b/c of the date, null record 
INSERT INTO @testRequest (TestRequestID, TestID, TestCost, TestDate) VALUES (4, 4, 100, '2018-01-01') 

-- TestID 5 will not get a match b/c none one scheduled it yet, null record 


SELECT 
TT.TestName, 
COUNT(TR.TestRequestID) [TestCount], 
ISNULL(SUM(TR.TestCost),0) [TotalCost] 
FROM @testType TT 
LEFT JOIN @testRequest TR ON TT.TestID = TR.TestID 
AND TR.TestDate BETWEEN GETDATE() AND GETDATE() 
GROUP BY TT.TestName; 

/* 
Results: 
    Bone  2 20 
    Chest  4 80 
    Head  1 50 
    Infection 0 0 
    Leg   0 0 
*/ 


-- To see null values run the query below 
SELECT 
* 
FROM @testType TT 
LEFT JOIN @testRequest TR ON TT.TestID = TR.TestID 
AND TR.TestDate BETWEEN GETDATE() AND GETDATE() 

/* 
Results: 
1 Bone 1 1 10 2017-01-16 20:17:31.030 
1 Bone 2 1 10 2017-01-16 20:17:31.030 
2 Chest 3 2 20 2017-01-16 20:17:31.030 
2 Chest 4 2 20 2017-01-16 20:17:31.030 
2 Chest 4 2 20 2017-01-16 20:17:31.030 
2 Chest 4 2 20 2017-01-16 20:17:31.030 
3 Head 4 3 50 2017-01-16 20:17:31.030 
4 Infection NULL NULL NULL NULL 
5 Leg NULL NULL NULL NULL 
*/ 
Смежные вопросы