2017-09-01 61 views
1

总结另一列枢转我有一个表(注:由同事使用Excel中导入)在访问包含这样的事情:访问SQL合并多个列,并且在合并塔

Associate | Date_Of_First_Call | Date_of_Second_Call | Date_of_Third_Call 
Amy  | 07/18/2017   | 07/19/2017   | 07/20/2017 
Brian  | 07/18/2017   | 07/18/2017   | 07/20/2017 
Amy  | 07/18/2017   | 07/20/2017   | 
Carl  | 07/19/2017   | 07/20/2017   | 07/21/2017 

我非常新以SQL从我学会为止...

SELECT Date_Of_First_Call AS CallDate, 
SUM(IIF(Associate ="Amy", 1, 0)) AS Amy, 
SUM(IIF(Associate= "Brian", 1, 0)) AS Brian, 
SUM(IIF(Associate="Carl", 1, 0)) AS Carl, 
FROM table_name 
GROUP BY Date_Of_First_Call 
UNION 
SELECT Date_Of_Second_Call AS CallDate, 
SUM(IIF(Associate ="Amy", 1, 0)) AS Amy, 
SUM(IIF(Associate= "Brian", 1, 0)) AS Brian, 
SUM(IIF(Associate="Carl", 1, 0)) AS Carl, 
FROM table_name 
GROUP BY Date_Of_Second_Call 
UNION 
SELECT Date_Of_Third_Call AS CallDate, 
SUM(IIF(Associate ="Amy", 1, 0)) AS Amy, 
SUM(IIF(Associate= "Brian", 1, 0)) AS Brian, 
SUM(IIF(Associate="Carl", 1, 0)) AS Carl, 
FROM table_name 
GROUP BY Date_Of_Third_Call 

给我:

Call Date | Amy | Brian | Carl 
07/18/2017 | 2 | 1  | 
07/18/2017 |  | 1  | 
07/19/2017 |  |  | 1 
07/19/2017 | 1 |  | 
07/20/2017 | 1 |  | 1 
07/20/2017 | 1 | 1  | 
07/21/2017 |  |  | 1 

关闭!但我想这不是以下:

Call Date | Amy | Brian | Carl 
07/18/2017 | 2 | 2  | 
07/19/2017 | 1 |  | 1 
07/20/2017 | 2 |1  | 1 
07/21/2017 |  |  | 1 

FYI:我能得到导致上述情况,如果我创建了三个独立的变换/透视查询并将其unioning成一个,但需要一共有四个查询。所以,如果有一种方法可以做到这一点,那将是惊人的!谢谢!

+1

你真的应该读入数据库规范化。在表格的不同列中存储基本相似的信息是一种非常糟糕的做法。 –

+0

谢谢你的评论Erik。然而,这三列中唯一的共同信息是它们是日期类型。每栏表示一位员工称为某人的日期,他们有三次机会接触某人:1)第一次约会,2)第二次约会,3)第三次约会。 – Mika

+0

他们都引用电话,他们不是吗?你想总结它们的事实意味着它们是相关的。大多数'UNION'查询都是非标准化数据的指标。而你因此而陷入困境。如果你将这个规范化的存储,这个操作将需要更少的步骤,就像我将要演示的那样。如果您想对通话日期执行操作(例如,修正某个时区),则可能需要将其应用于所有这些列,而您只需将其应用于一个列。适当规范化后,最大3个呼叫的限制将被解除。 –

回答

1

首先,我们要标准化数据,这个查询将在以后作为一个子查询:

SELECT Associate, date_of_first_call as CallDate 
FROM table_name 
UNION ALL 
SELECT Associate, date_of_second_call as CallDate 
FROM table_name 
UNION ALL 
SELECT Associate, date_of_third_call as CallDate 
FROM table_name 

这是在表中存储数据的标准化方式(可以包括数如果是第一次,第二次或第三次呼叫,请参考)。

现在,让我们交叉表:

TRANSFORM Count(A.CallDate) AS CountOfCallDate 
SELECT A.CallDate 
FROM (
    SELECT Associate, date_of_first_call as CallDate 
    FROM table_name 
    UNION ALL 
    SELECT Associate, date_of_second_call as CallDate 
    FROM table_name 
    UNION ALL 
    SELECT Associate, date_of_third_call as CallDate 
    FROM table_name 
) As A 
GROUP BY A.CallDate 
PIVOT A.Associate 
+0

非常感谢您的帮助!它完美的工作!现在我有点理解正常化。此外,由于TRANSFORMATION语句中的语法错误,我将“A.CountOfCallDate”更改为“CountOfCallDate”。 – Mika

+0

啊,是的,对不起,我会编辑答案。 –