连接两个表,以便结果显示在多个列中

时间:2018-03-23 21:53:50

标签: sql sql-server

假设我们有这样的数据表

+----------------+------------+-------+
| Company_number |    Date    | Value |
+----------------+------------+-------+
|            123 | 2017-01-01 |     5 |
|            123 | 2017-02-01 |    10 |
|            123 | 2018-01-01 |    15 |
|            456 | 2018-01-05 |    33 |
+----------------+------------+-------+

如何以格式

接收数据
+----------------+------+------------+------------+
| Company_number | Mont | Value 2017 | Value 2018 |
+----------------+------+------------+------------+
|            123 |   01 |          5 |         15 |
|            123 |   02 |         10 |            |
|            456 |   01 |         33 |            |
+----------------+------+------------+------------+

我不知道如何选择2017年的所有数据,并使用公司编号和月份与2018年的数据进行连接。

我已经从2017年获取了所有记录,将其放入另一个表中,并尝试使用此选择,但在没有常见月份时没有显示记录(2月没有记录)。

select 
s.company_number
,datepart(month,s.date) as Month
,s.Value as Value_2017
,r.Value as Value_2018
from table1 as s
left join table2 as r on concat(r.company_number,datepart(month,r.date))=concat(s.company_number,datepart(month,s.date))
where datepart(year,s.date)='2018'



select results (with no February)
    +----------------+-------+------------+------------+
    | company_number | Month | Value_2017 | Value_2018 |
    +----------------+-------+------------+------------+
    |            123 |     1 |         15 | 5          |
    |            456 |     1 |         33 | NULL       |
    +----------------+-------+------------+------------+

2 个答案:

答案 0 :(得分:6)

试试这个:

DECLARE @t1 TABLE (Company_number INT, [Date] Date, Value INT)
DECLARE @t2 TABLE (Company_number INT, [Date] Date, Value INT)
INSERT INTO @t1 VALUES (123, '2017-01-01', 5), (123, '2017-02-01', 10)
INSERT INTO @t2 VALUES (123, '2018-01-01', 15), (456, '2018-01-05', 33)

SELECT 
    COALESCE([t1].Company_number, [t2].Company_number) AS [Company_Number],
    MONTH(COALESCE([t1].[date], [t2].[date])) AS [Month],
 [t1].[value] AS [2018 Value], 
    [t2].[value] AS [2017 Value]
FROM 
    @t1 AS [t1]
FULL OUTER JOIN 
    @t2 as [t2] on [t1].[company_number] = [t2].[company_number] 
    AND MONTH([t1].[date]) = MONTH ([t2].[date])

刚尝试过(可以在编辑器中复制/粘贴并执行)并且工作正常:

pip install cx_oracle==5.1.3

答案 1 :(得分:1)

这是在2017年和2018年的同一张桌子上使用CTE而不是两张桌子。

With tmp as (Select company_id,

Datepart(year,dte)作为年份, Datepart(月,dte)作为月份, 总和(值)作为值 来自tbl 按group_id分组, Datepart(年,dte), Datepart(月,dte)) 选择coalesce(m.company_id,n.company_id)作为company_id, coalesce(m.month,n.month)作为月份, m.value as value_2017, n.value as value_2018 从(选择*来自tmp 年份= 2017年)m 全外连接(从tmp中选择*) 年份= 2018年)n 在m.company_id = n.company_id上 和m.month = n.month

Result:
   company_number   month   Value_2017  Value_2018
    123             1        5                    5
    123             2       10          (null)
    456             1    (null)             23