Динамически генерировать уникальный первичный ключ для композиции столбца в операторе SELECT T-SQL - PullRequest
0 голосов
/ 16 октября 2018

Кто-нибудь знает, есть ли способ сгенерировать уникальный целочисленный первичный ключ в операторе MS SQL Server / Transact SQL SELECT?

У меня проблема с программным объединением 3 таблиц данных спо композиции столбцов (например, составной первичный ключ).Композиция не фактический первичный ключ, хотя.

Мои таблицы выглядят примерно так:

Table 1: Base Table which is needed to be filled: 
+----------+------+----------------+------------+----------+
|operatorid|opcode|bookkeeping_date|cash_amount |tip_amount|
+----------+------+----------------+------------+----------+
| 1        | 1    | 01.01.2018     |null        |null      |
+----------+------+----------------+------------+----------+
| 1        | 1    | 01.02.2018     |null        |null      |
+----------+------+----------------+------------+----------+
| 2        | 2    | 01.02.2018     |null        |null      |
+----------+------+----------------+------------+----------+

Table 2: Cash Data Table to be merged with base table
+----------+------+----------------+------------+
|operatorid|opcode|bookkeeping_date|cash_amount |
+----------+------+----------------+------------+
| 1        | 1    | 01.01.2018     |2.50        |
+----------+------+----------------+------------+
| 1        | 1    | 01.02.2018     |17.80       |
+----------+------+----------------+------------+
| 2        | 2    | 01.02.2018     |4.20        |
+----------+------+----------------+------------+

Table 3: Tip Data Table to be merged with base table: 
+----------+------+----------------+----------+
|operatorid|opcode|bookkeeping_date|tip_amount|
+----------+------+----------------+----------+
| 1        | 1    | 01.01.2018     |3.50      |
+----------+------+----------------+----------+
| 1        | 1    | 01.02.2018     |4.20      |
+----------+------+----------------+----------+
| 2        | 2    | 01.02.2018     |0.00      |
+----------+------+----------------+----------+

Таким образом, упрощенная цель состоит в том, чтобы заполнить «Таблицу 1: Базовая таблица» путем объединения таблиц данных.У нас уже есть метод ac # для управления слиянием по первичному ключу после выбора таблиц данных.

Моя проблема сейчас в том, что у меня нет уникального первичного ключа, но есть сочетание "operatorid" и "bookkeeping_date".

Есть ли способ изменить мои операторы SELECT для каждой таблицы, чтобы получить уникальное целое число по хешу, контрольной сумме или тому подобному?

Редактировать: Сумма наличных и сумма чаевых являются суммированными значениями в ведомостях выбора таблицы с использованием совокупной суммы SUM ().

С наилучшими пожеланиями

Эпаналепсис

1 Ответ

0 голосов
/ 16 октября 2018

Я уверен, что данные могут регулярно изменяться в этих таблицах, и поскольку всегда можно вводить исторические записи, которые отбрасывают любые функции ранжирования или номера строк, вероятно, было бы лучше пойти по маршруту, который использует operatorid и bookkeeping_dateв тандеме для создания уникального ключа.

Одним из простых подходов было бы преобразование даты в целочисленное значение и добавление operatorid до конца.

1/1/2018 становится «43099».Operatorid 1 становится равным «1» в конце (или «01» / «001» / «0001», если эти идентификаторы могут стать большими целыми числами).

select
convert(int, convert(varchar(6), convert(int, (convert(datetime,replace(bookkeeping_date,'.','-'),110)))) 
    + convert(varchar(2), operatorid)) as unique_id
from (select 1 as operatorid, 1 as opcode, '01.01.2018' as bookkeeping_date, 3.50 as tip_amount) tip

У вас будет несколькоза столетия до того, как целые числа даты достигают шести цифр и могут вызвать некоторые осложнения, но вы также можете преобразовать целое число даты во что-то с конечными нулями, чтобы учесть это, если это вызывает озабоченность.

...