Как объединить две таблицы и получить значения из второй таблицы, только если они существуют? - PullRequest
0 голосов
/ 02 декабря 2018

TABLE1 - это всего лишь 1 столбец и 28 строк.Каждая строка представляет собой DateTime за последние 28 дней.

TABLE2 состоит из 2 столбцов: DateTime и Value.Количество строк непредсказуемо, но DateTime всегда будет за последние 28 дней.

Я хочу объединить эти две таблицы, чтобы в результирующей таблице было 2 столбца, DateTime и Value, и 28 строк,по одному на каждый из последних 28 дней.Столбец Значение берется из TABLE2, если он присутствует, или NULL или -1, если он отсутствует.

Каков наилучший способ сделать это?

TABLE 1 (28x1)

DATE
11/3/2018 12:00:00AM
11/4/2018 12:00:00AM
11/5/2018 12:00:00AM
...
...
11/30/2018 12:00:00AM

ТАБЛИЦА 2 (4x2)

DATE                  | VALUE
----------------------+-------
11/3/2018 12:00:00AM  |  45
11/21/2018 12:00:00AM |  78
11/22/2018 12:00:00AM |  85
11/29/2018 12:00:00AM | 103

Ожидаемый результат (28x2)

DATE                 | VALUE
---------------------+-------
11/3/2018 12:00:00AM | 45
11/4/2018 12:00:00AM | null
11/5/2018 12:00:00AM | null
...
...
11/20/2018 12:00:00AM | null
11/21/2018 12:00:00AM | 78
11/22/2018 12:00:00AM | 85
11/23/2018 12:00:00AM | null
...
11/29/2018 12:00:00AM | 103
11/30/2018 12:00:00AM | null

Любое соединение, которое я пробовалдалеко не работает, потому что я должен объединить столбец, и единственный общий столбец - это DateTime, который удаляет строки без значений.

Ответы [ 3 ]

0 голосов
/ 02 декабря 2018

Мое предложение о названии столбца, не используйте зарезервированное слово sqlserver в столбце, таком как Date или Datetime.

Приведенный ниже пример, который решит вашу проблему: (Как предложено выше, вам нужно оставить соединение)

declare @table1 table( dateColumn datetime)
declare @table2 table( dateColumn datetime, value int)

--insert into @table1 values ('11/3/2018 12:00:00AM' ),( '11/4/2018 12:00:00AM'), ('11/5/2018 12:00:00AM')
--To test I insert current month's all dates in @table1
Declare @year int = 2018, @month int = 11;
WITH numbers
as
(
    Select 1 as value
    UNion ALL
    Select value + 1 from numbers
    where value + 1 <= Day(EOMONTH(datefromparts(@year,@month,1)))
)

Insert into @Table1  
SELECT datefromparts(@year,@month,numbers.value) Datum FROM numbers

insert into @table2 values ('11/3/2018 12:00:00AM' , 45), ('11/21/2018 12:00:00AM', 78), ('11/22/2018 12:00:00AM', 85), ('11/29/2018 12:00:00AM', 103)

SELECT    t1.dateColumn, t2.[value]
FROM    @table1  t1
LEFT JOIN @table2 t2 ON t1.dateColumn = t2.dateColumn
0 голосов
/ 02 декабря 2018

Надеюсь, что это решит вашу проблему.

SELECT    t1.[datetime], t2.[value]
FROM      t1
LEFT JOIN t2 ON cast(t1.[datetime] as date) = cast(t2.[datetime] as date)
0 голосов
/ 02 декабря 2018

Это то, для чего left join были изобретены:

SELECT    t1.[datetime], t2.[value]
FROM      t1
LEFT JOIN t2 ON t1.[datetime] = t2.[datetime]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...