There is a discrepancy in your row code vs your total code.
The former uses OUTER LEFT JOIN
, while the latter - more restrictive INNER JOIN
.
题
I have a query in which a table is created and left joined with a a WITH name AS()
That portion of the query runs just fine and returns results as expected in the following format:
VISIT_ID | ACTUAL WEIGHT | STATED WEIGHT | WAS WEIGHT INFO OBTAINED?
123 | 1 | 0 | 0
321 | 0 | 0 | 1
567 | 0 | 1 | 0
...
I then use add a UNION ALL
to it to obtain totals at the bottom of the columns. The columns ACTUAL WEIGHT
and STATED WEIGHT
are adding up just fine but the WAS WEIGHT INFO OBTAINED?
column is off by 1.
The columns are flags 1 and 0, the third column will produce a 1 if both columns [ACTUAL WEIGHT] AND [STATED WEIGHT]
are both NULL
Here is my query:
-- VARIABLE DECLARATION AND INITIALIZATION
DECLARE @SD DATE;
DECLARE @ED DATE;
SET @SD = '2013-12-16'
SET @ED = '2013-12-16';
-- THIS CREATES A TABLE WHERE ALL THE DESIRED VISIT ID NUMBERS WILL GO
-- THIS TABLE IS A UNIQUE CLUSTER
CREATE TABLE #T1
(
VISIT_ID VARCHAR(20) UNIQUE CLUSTERED
)
-- WHAT GETS INSERTED INTO #T1. IT IS QUICKER TO USE #T1 THAN @T1
INSERT INTO #T1
SELECT DISTINCT PTNO_NUM
FROM smsdss.BMH_PLM_PtAcct_V
WHERE Adm_Date BETWEEN @SD AND @ED
AND Plm_Pt_Acct_Type = 'I'
AND PtNo_Num < '20000000'
OPTION(RECOMPILE);
--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
WITH WT AS
(SELECT EPISODE_NO,
MAX(CASE
WHEN FORM_USAGE = 'Admission'
AND OBSV_CD = 'A_WEIGHTOBTAINED'
AND DSPLY_VAL = 'Actual'
THEN 1
END) AS [ACTUAL WEIGHT],
MAX(CASE
WHEN FORM_USAGE = 'ADMISSION'
AND OBSV_CD = 'A_WEIGHTOBTAINED'
AND DSPLY_VAL = 'STATED'
THEN 1
END) AS [STATED WEIGHT]
FROM smsmir.obsv
WHERE form_usage = 'ADMISSION'
GROUP BY episode_no
)
SELECT T1.VISIT_ID
, ISNULL(WT.[ACTUAL WEIGHT], 0) AS [ACTUAL WEIGHT]
, ISNULL(WT.[STATED WEIGHT], 0) AS [STATED WEIGHT]
, CASE
WHEN [ACTUAL WEIGHT] IS NULL AND [STATED WEIGHT] IS NULL
THEN 1
ELSE 0
END AS [WAS WEIGHT INFO OBTAINED?]
FROM #T1 T1
LEFT JOIN WT WT
ON T1.VISIT_ID = WT.episode_no
UNION ALL
SELECT 'TOTALS'
, SUM(WT.[ACTUAL WEIGHT])
, SUM(WT.[STATED WEIGHT])
, SUM(
CASE
WHEN [ACTUAL WEIGHT] IS NULL AND [STATED WEIGHT] IS NULL
THEN 1
ELSE 0
END)
FROM #T1 T1
JOIN WT WT
ON T1.VISIT_ID = WT.[episode_no]
DROP TABLE #T1
Any info on why this is happening would be great.
I would like the info to all come out meaning I am trying to obtain the following:
VISIT_ID | ACTUAL WEIGHT | STATED WEIGHT | WAS WEIGHT INFO OBTAINED?
123 | 1 | 0 | 0
321 | 0 | 0 | 1
567 | 0 | 1 | 0
...
TOTALS | 10 | 25 | 9
解决方案
There is a discrepancy in your row code vs your total code.
The former uses OUTER LEFT JOIN
, while the latter - more restrictive INNER JOIN
.