У меня есть несколько SKU для проданных / выставленных счетов-фактур в таблице базы данных, но некоторые из SKU имеют дополнительные данные, добавленные в конце SKU, разделенные каналом (может быть много каналов после базового SKU). то есть я мог бы иметь такой же продукт SKU, как это
correct-product-sku
correct-product-sku|assembled
correct-product-sku|assembled|custom
etc...
Я хочу объединить таблицу продуктов с таблицей счетов-фактур.
SELECT COUNT(*) AS totalCount, productVariant.productKey
FROM invoiceItem
INNER JOIN productVariant ON invoiceItem.sku = productVariant.sku
Но это только присоединится к базовому SKU correct-product-sku
и проигнорирует остальные.
Есть ли эффективный способ разделить invoiceItem.sku
по |
а затем использовать только первую часть [0]
. Очевидно, что у SKU не всегда будет |
в нем или может быть добавлен один или несколько.
Любые указатели будут оценены.
Всего 3 ответа
Вы можете использовать функции CHARINDEX и LEFT, как показано ниже, чтобы присоединиться к
Код редактируется с учетом того, что столбец Sku содержит только реальное значение без каких-либо | в этом.
SELECT COUNT(*) AS totalCount, productVariant.productKey
FROM invoiceItem
INNER JOIN productVariant
ON LEFT(
invoiceItem.sku,
CASE
WHEN CHARINDEX('|',invoiceItem.sku,0) = 0 THEN LEN(invoiceItem.sku)
ELSE CHARINDEX('|',invoiceItem.sku,0) -1
END
) = productVariant.sku
Я собирался предложить функцию подстроки, но в этой ситуации левый более ясен:
substring(invoiceItem.sku, 1, charindex('|', invoiceItem.sku)-1)
Если sku имеет фиксированную длину, вы можете использовать длину вместо функции charindex.
Вы можете использовать как:
SELECT COUNT(*) AS totalCount, pv.productKey
FROM invoiceItem it INNER JOIN
productVariant pv
ON pv.sku LIKE i.sku + '|%'
GROUP BY pv.productKey;