Выберите из конкатенации двух столбцов после левого соединения - PullRequest
0 голосов
/ 26 сентября 2019

Описание проблемы

Пусть в таблицах C и V есть эти значения

                 >> Table V <<
| UnID | BillID |       ProductDesc        |   Value  | ... |
|   1  |    1   |      'Orange Juice'      |    3.05  | ... |
|   1  |    1   |       'Apple Juice'      |    3.05  | ... |
|   1  |    2   |          'Pizza'         |   12.05  | ... |
|   1  |    2   |        'Chocolates'      |    9.98  | ... |
|   1  |    2   |          'Honey'         |   15.98  | ... |
|   1  |    3   |          'Bread'         |    3.98  | ... |
|   2  |    1   |          'Yogurt'        |    8.55  | ... |
|   2  |    1   |        'Ice Cream'       |    7.05  | ... |
|   2  |    1   |          'Beer'          |    9.98  | ... |
|   2  |    2   |  'League of Legends RP'  |   40.00  | ... |

               >> Table C <<
| UnID | BillID |    ClientName   |  ... |
|   1  |    1   |    'Alexander'  |  ... |
|   1  |    2   |      'Tom'      |  ... |
|   1  |    3   |      'Julia'    |  ... |
|   2  |    1   |       'Tom'     |  ... |
|   2  |    2   |    'Alexander'  |  ... |

В таблице C указаны значения каждого продукта, который связан со счетомномер.Таблица V имеет отношение между именем клиента и номером счета.Однако номер счета имеет счетчик, который зависит от UnId, который является идентификатором единства магазина.При этом каждый магазин имеет свой собственный счет № 1, номер 2 и т. Д. Кроме того, количество счетов в каждом магазине не равно.

Описание решения

Япытаясь сделать выбор между C левого соединения V без успеха.Поскольку каждый BillID зависит от UnID, я должен выполнить соединение, учитывая сцепление между этими двумя столбцами.Я использовал этот скрипт, но он выдает ошибку.

SELECT
   SUM(C.Value),
   V.ClientName
FROM
   C
LEFT JOIN
   V
ON 
   CONCAT(C.UnID, C.BillID) = CONCAT(V.UnID, V.BillID)
GROUP BY
   V.ClientName

и SQL-сервер возвращает мне это 'CONCAT' is not a recognized built-in function name.Я использую Microsoft SQL Server 2008 R2

Является ли использование CONCAT неправильным?Или это так, как я пытался выбрать?Не могли бы вы мне помочь?

[OBS: Таблицы, которые я вам представляю, предназначены только для объяснения моих трудностей.При этом, если вы обнаружите какие-либо ошибки в объяснении, пожалуйста, дайте мне знать, чтобы исправить их.]

Ответы [ 2 ]

4 голосов
/ 26 сентября 2019

Вы должны присоединиться к равенству столбцов UnID и BillID в двух таблицах:

SELECT
    c.ClientName,
    COALESCE(SUM(v.Value), 0) AS total
FROM C c
LEFT JOIN V v
    ON c.UnID = v.UnID AND
       c.BillID = v.BillID
GROUP BY
    c.ClientName;

В теории вы можете попробовать присоединиться к CONCAT(UnID, BillID),Тем не менее, вы можете столкнуться с проблемами.Например, UnID = 1 с BillID = 23, объединенные вместе, будут такими же, как UnID = 12 и BillID = 3.

Примечание. Мы заключаем сумму в COALESCE, поскольку данный клиент должен иметьнет записей в таблице V, сумма вернет NULL, который мы затем заменим на ноль.

0 голосов
/ 26 сентября 2019

concat доступен только в SQL Server 2012.

Вот один из вариантов.

SELECT
   SUM(C.Value),
   V.ClientName
FROM
   C
LEFT JOIN
   V
ON 
   cast(C.UnID as varchar(100)) + cast(C.BillID as varchar(100)) = cast(V.UnID as varchar(100)) + cast(V.BillID as varchar(100))
GROUP BY
   V.ClientName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...