SQL组合和/或加入两个表?

时间:2015-02-02 20:32:35

标签: sql sql-server sql-server-2008

我正在尝试从同一视图中的两列计算中位数,我将调用列PtAPtC。由于数据的性质,当PtANULL时,行不应包含在中值计算中。但是,PtC的情况,因为此列永远不会NULL。如果PtAPtC都是NOT NULL,则应将其加入。但是,如果PtANULLPtCNOT 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}}。

编辑: 以下是NULLrawDataPtA

rawDataPtC

2 个答案:

答案 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 ,其中一些示例数据显示了这两种结果。