SQL - определение направления бизнеса клиента по столбцу продукта - PullRequest
0 голосов
/ 03 мая 2019

У меня есть таблица, которая содержит информацию о клиенте - номер клиента, продукт и т. Д. Я хочу определить, в какой сфере деятельности каждый клиент является участником, исходя из того, какими продуктами он владеет. Каждый клиент может иметь 1 или более строк (каждая строка обозначает клиента и его продукт). Это выглядит примерно так:

Customer #  Product
-----------------------------------------   
000000001   BROKERAGE   
000000001   CHECKING
000000001   CREDIT CARD 
000000001   SAVING
000000001   LIFE INSURANCE  

Теперь, это всего лишь один клиент, но у меня есть правила относительно того, какие продукты являются частью какой сферы деятельности, такие как:

БАНК: ПРОВЕРКА, КРЕДИТНАЯ КАРТА, ЭКОНОМИЯ

ИНВЕСТИЦИИ: БРОКЕРСКИЙ, ВЗАИМНЫЙ ФОНД

СТРАХОВАНИЕ ЖИЗНИ: СТРАХОВАНИЕ ЖИЗНИ

Что я хочу сделать, это посмотреть на всю таблицу по клиенту и сказать, что если этот клиент владеет каким-либо банковским продуктом, я хочу создать новый столбец «Банк» и поставить «Y» в этом столбце для каждой строки. этот клиент в истории - это говорит мне, что, независимо от того, на какую строку я смотрю, этот клиент был клиентом банка. В конце я бы хотел колонку для всех этих больших объектов, поэтому конечный продукт будет выглядеть так:

Customer #  Product          Bank    Investments    Life
---------------------------------------------------------
000000002   BROKERAGE          Y          Y           N
000000002   CHECKING           Y          Y           N
000000002   CREDIT CARD        Y          Y           N
000000002   SAVING             Y          Y           N

Логика здесь заключается в том, что столбцы «Банк» и «Инвестиции» имеют «Y», поскольку у клиента есть хотя бы один продукт из каждого из этих больших объектов. Однако у клиента нет полиса страхования жизни, поэтому весь столбец для этого клиента будет «N».

У меня несколько клиентов, очевидно, поэтому я пытался сделать это с помощью оператора case, но я использовал только просмотр столбца для текущей строки, поэтому я получаю только «Y» там, где эта строка соответствует , Я хочу, чтобы какая-то строка для этого клиента соответствовала ... Я подумал, что, возможно, что-то делаю с PARTITION или GROUP BY, но я не знаю, с чего начать .... Есть идеи или советы?

Ответы [ 3 ]

1 голос
/ 03 мая 2019

Это должно сделать это ... быстрое, простое и быстрое решение.

DECLARE @Products table
(
        CustomerNumber int
    ,   Product nvarchar(50)
)

INSERT @Products VALUES (1, 'BROKERAGE')
INSERT @Products VALUES (1, 'CHECKI[NG')
INSERT @Products VALUES (1, 'CREDIT CARD')
INSERT @Products VALUES (2, 'SAVINGS')
INSERT @Products VALUES (2, 'LIFE INSURANCE')


;WITH
ProductTypes AS
(
    SELECT
            CustomerNumber
        ,   SUM(CASE WHEN Product IN ('CHECKING', 'CREDIT CARD', 'SAVINGS') THEN 1 ELSE 0 END) AS Bank
        ,   SUM(CASE WHEN Product IN ('BROKERAGE', 'MUTUAL FUND') THEN 1 ELSE 0 END) AS Investments
        ,   SUM(CASE WHEN Product IN ('LIFE INSURANCE') THEN 1 ELSE 0 END) AS Life
    FROM    @Products
    GROUP BY CustomerNumber
)
SELECT
        Products.CustomerNumber
    ,   Products.Product
    ,   CASE WHEN Bank > 0 THEN 'Y' ELSE 'N' END AS Bank
    ,   CASE WHEN Investments > 0 THEN 'Y' ELSE 'N' END AS Investments
    ,   CASE WHEN Life > 0 THEN 'Y' ELSE 'N' END AS Life
FROM    @Products AS Products
LEFT JOIN ProductTypes ON (ProductTypes.CustomerNumber = Products.CustomerNumber)

Эта версия была изменена, чтобы учесть ваш комментарий о том, что вы делаете первоначальное объединение для получения исходной таблицы.

DECLARE @Customer table
(
        CustomerNumber int
)

INSERT @Customer VALUES (1)
INSERT @Customer VALUES (2)

DECLARE @Products table
(
        CustomerNumber int
    ,   Product nvarchar(50)
)

INSERT @Products VALUES (1, 'BROKERAGE')
INSERT @Products VALUES (1, 'CHECKI[NG')
INSERT @Products VALUES (1, 'CREDIT CARD')
INSERT @Products VALUES (2, 'SAVINGS')
INSERT @Products VALUES (2, 'LIFE INSURANCE')


;WITH
CustomerProducts AS
(
    SELECT
            Customer.CustomerNumber
        ,   Products.Product
    FROM @Customer AS Customer
    LEFT JOIN @Products AS Products ON (Products.CustomerNumber = Customer.CustomerNumber)
)
, ProductTypes AS
(
    SELECT
            CustomerNumber
        ,   SUM(CASE WHEN Product IN ('CHECKING', 'CREDIT CARD', 'SAVINGS') THEN 1 ELSE 0 END) AS Bank
        ,   SUM(CASE WHEN Product IN ('BROKERAGE', 'MUTUAL FUND') THEN 1 ELSE 0 END) AS Investments
        ,   SUM(CASE WHEN Product IN ('LIFE INSURANCE') THEN 1 ELSE 0 END) AS Life
    FROM    CustomerProducts
    GROUP BY CustomerNumber
)
SELECT
        CustomerProducts.CustomerNumber
    ,   CustomerProducts.Product
    ,   CASE WHEN Bank > 0 THEN 'Y' ELSE 'N' END AS Bank
    ,   CASE WHEN Investments > 0 THEN 'Y' ELSE 'N' END AS Investments
    ,   CASE WHEN Life > 0 THEN 'Y' ELSE 'N' END AS Life
FROM    CustomerProducts
LEFT JOIN ProductTypes ON (ProductTypes.CustomerNumber = CustomerProducts.CustomerNumber)
1 голос
/ 03 мая 2019

Попробуйте что-то вроде этого:

SELECT tbl.customer, tbl.product,
case when temp.Bank>0 then 'Y' else 'N' end as Bank,
case when temp.Investment>0 then 'Y' else 'N' end as Investment,
case when temp.Insurance>0 then 'Y' else 'N' end as Insurance
FROM tbl
LEFT JOIN
(SELECT customer,
sum(case when Product in ('CHECKING', 'CREDIT CARD', 'SAVINGS') then 1 else 0 end) as Bank, 
sum(case when Product in ('BROKERAGE','MUTUAL FUNDS') then 1 else 0 end) as Investment,
sum(case when Product in ('LIFE INSURANCE') then 1 else 0 end) as Insurance
FROM tbl
GROUP BY Customer) tmp
on tmp.customer=tbl.customer
0 голосов
/ 08 мая 2019

Хотя два вышеупомянутых решения были полезны, в конце концов, решение, которое я искал, оказалось намного проще.Я нашел сообщение, в котором описана похожая проблема, и предлагаемое решение состояло в том, чтобы использовать MAX () для этого столбца, сгруппированного по идентификатору / пользователю / любому другому.Итак, если у меня есть следующее:

Customer #  Product
----------------------------   
000000001   BROKERAGE   
000000001   CHECKING
000000001   CREDIT CARD 
000000001   SAVING
000000001   LIFE INSURANCE 
000000002   BROKERAGE   
000000002   LIFE INSURANCE 

Я создаю соответствующие столбцы для Банка, Инвестиции и Жизнь, используя операторы CASE, чтобы получить следующее:

Customer #  Product          Bank    Investments    Life
---------------------------------------------------------
000000001   BROKERAGE          N          Y           N
000000001   CHECKING           Y          N           N
000000001   CREDIT CARD        Y          N           N
000000001   SAVING             Y          N           N
000000002   BROKERAGE          N          Y           N
000000002   LIFE INSURANCE     N          N           Y

Итак, теперь яЯ знаю, на основе каких строк, какой LOB этот продукт, но так как я просто хочу получить сводную информацию о том, к каким LOB принадлежит каждый клиент (Y / N).В этом случае я знаю, что клиент № 1 является частью Банка и Инвестиций (этот клиент владеет как минимум одним продуктом от Банка и Инвестиций).Клиент № 2 имеет только Инвестиции и Страхование жизни, но не имеет банковских продуктов.Поэтому я хочу увидеть:

Customer #  Bank    Investments    Life
---------------------------------------------------------
000000001     Y          Y           N
000000002     N          Y           Y

Я делаю это, выполняя еще один SELECT из предыдущей таблицы / результата, сгруппированного по Customer #, делая MAX для каждого из этих столбцов Y / N по мере необходимости:

SELECT CUST_NUMBER,
MAX(BANK) AS BANK,
MAX(INVENTMENTS) AS INVESTMENTS,
MAX(LIFE) as LIFE
FROM
( ORIGINAL QUERY TO GET PRIOR TABLE
  GROUP BY CUST_NUMBER
) A
ON CUST_NUMBER = A.CUST_NUMBER

Это дает вам Y, если он существует для каждого столбца для любых строк, связанных с этим номером клиента.Если это все «Y», вы получите «Y», если есть хотя бы 1 «Y», вы получите «Y».Если столбец для этого клиента является «N» для всех значений в этом столбце, вы получите «N».Я проверил это по нескольким сценариям, и это прекрасно работает.Я надеюсь, что это поможет кому-то еще, кто имеет ту же проблему.

...