我正在尝试从同一视图中的两列计算中位数,我将调用列PtA
和PtC
。由于数据的性质,当PtA
为NULL
时,行不应包含在中值计算中。但是,PtC
的情况不,因为此列永远不会NULL
。如果PtA
和PtC
都是NOT NULL
,则应将其加入。但是,如果PtA
为NULL
但PtC
为NOT NULL
,则该字段应显示PtC
,但在NULL
中插入PtA
值{1}}栏。
我对理解执行背后的理论有些困难。我目前使用WITH
语句来获取两个表,其中一个表中包含所有PtA
个相关数据,另一个表中包含所有PtC
个数据。
当我在UNION ALL
- 和PtA
相关的表上PtC
时,会捕获所有数据,但显然没有加入应该存在的字段。有没有办法“加入/合并”这些数据如上所述?
当我JOIN
表时,PtC
表中不存在的任何PtA
相关条目将不存在,因为没有正确连接表的id捕获全部数据。
编辑:除了效率之外,还有一种方法JOIN
UNION ALL
中捕获的相关数据,因为结果表包含所有数据,同时仍保留所有PtC
1}} PtA
中没有的数据?
编辑: 以下是关于情况/结果应该是什么样的表格概念。
UNION ALL Result
DepartmentName MonthNumber CallType PtAMedian PtCMedian
Place 1 2 Type 1 8 NULL
Place 2 2 Type 2 NULL 9
Place 1 2 Type 1 NULL 54
Ideal Outcome
DepartmentName MonthNumber CallType PtAMedian PtCMedian
Place 1 2 Type 1 8 54
Place 2 2 Type 2 NULL 9
------
PtA (in this case)
DepartmentName MonthNumber CallType PtAMedian PtCMedian
Place 1 2 Type 1 8 NULL
PtC (in this case)
DepartmentName MonthNumber CallType PtAMedian PtCMedian
Place 2 2 Type 2 NULL 9
Place 1 2 Type 1 NULL 54
UNION ALL
图层具有实际计算中位数的SELECT
语句。这是声明:
SELECT
DepartmentName,
MonthNumber,
CallType,
CONVERT(DECIMAL(10,2), SUM(PtA) / CONVERT(DECIMAL(10,2), COUNT(PtA))) AS PtAMedian,
NULL AS PtCMedian
FROM
rawDataPtA
WHERE
RowNumberASC IN (RowNumberDESC, RowNumberDESC - 1, RowNumberDESC + 1)
GROUP BY DepartmentName, MonthNumber, CallType
UNION ALL
SELECT
DepartmentName,
MonthNumber,
CallType,
NULL AS PtAMedian,
CONVERT(DECIMAL(10,2), SUM(PtC) / CONVERT(DECIMAL(10,2), COUNT(PtC))) AS PtCMedian
FROM
rawDataPtC
WHERE
RowNumberASC IN (RowNumberDESC, RowNumberDESC - 1, RowNumberDESC + 1)
GROUP BY DepartmentName, MonthNumber, CallType
修改
rawDataPtA
是包含所有数据行和删除了所有NULL
值的表格,而rawDataPtC
是没有此类修改的类似表格,因为PtC
不能{ {1}}。
编辑:
以下是NULL
和rawDataPtA
:
rawDataPtC
答案 0 :(得分:1)
不要将你的表联合起来,从PtaC到PtaA视图的左连接:
Select DepartmentName, MonthNumber, CallType, PtCMedian, PtAMedian
From PtCView
LEFT JOIN PtAView ON
PtCView.departmentName = PtAView.departmentName AND
PtCView.MonthNumber = PtAView.MonthNumber AND
PtCView.CallType = PtAView.CallType
答案 1 :(得分:0)
我对你的语言感到困惑。你说,“......当PtA为NULL时,行不应包含在中位数计算中。”应排除整行还是仅排除PtA字段?然后你说,“当PtA和PtC都不是NULL时,它们应该被连接起来。”加入?加入怎么样?你也说“卑鄙”,但列别名是“中位数”,你显示的计算是按月平均值。
这是两个查询,一个给出Pta为非NULL的实例数的平均PtA。忽略任何NULL,这是AVG
函数的正常行为。另一个给出了所有行的平均值,将NULL视为零。你需要哪一个取决于你真正想要如何处理NULL。
SELECT DepartmentName, MonthNumber, CallType, ( PtA ) as PtA_Avg, Avg( PtC) as PtC_Avg
FROM MyTable
GROUP BY DepartmentName, MonthNumber, CallType;
SELECT DepartmentName, MonthNumber, CallType, Avg( IsNull( PtA, 0 ) ) as PtA_Avg, Avg( PtC) as PtC_Avg
FROM MyTable
GROUP BY DepartmentName, MonthNumber, CallType;
这是 Fiddle ,其中一些示例数据显示了这两种结果。