Использование SQL - Как агрегировать тип платежа - PullRequest
1 голос
/ 06 мая 2020

Как я могу агрегировать поле PaymentType, чтобы, если клиент использовал ранее все типы платежей, на экране типа платежа отображалось «Все» вместо «Ca sh», «Чек», «Кредитная / дебетовая карта», или «Корпоративный счет»? Ниже приведен сценарий, необходимый для демонстрации проблемы.

enter image description here

CREATE TABLE #Customer (
    CustomerId int,
    CustomerName nvarchar(100),
    Address nvarchar(100),
)
INSERT INTO #Customer
VALUES (1, 'Bill', '123 1st St'),
       (2, 'Fred', '111 Market St'),
       (3, 'Lisa', '01 Boulevard')

CREATE TABLE #Product (
    ProductId int,
    ProductName nvarchar(100)
)
INSERT INTO #Product
VALUES (1, 'Corn Flakes'),
       (2, 'Cheerios'),
       (3, 'Granoloa')

CREATE TABLE #PaymentType (
    PaymentId int,
    PaymentTypeName nvarchar(100)
)

INSERT INTO #PaymentType
VALUES (1, 'Cash'),
       (2, 'Check'),
       (3, 'Credit/Debit Card'),
       (4, 'Corporate Account')

CREATE TABLE #TransactionLog (
    LogId int,
    ProductId int,
    CustomerId int,
    PaymentId int,
    Amount float
)
INSERT INTO #TransactionLog
VALUES (1, 1, 1, 1, 2.00),
       (2, 2, 1, 2, 2.40),
       (3, 3, 1, 3, 1.80),
       (4, 1, 1, 4, 2.00),
       (5, 1, 2, 4, 2.00),
       (6, 2, 3, 2, 2.40)

SELECT * from #Customer
SELECT * from #Product
SELECT * from #PaymentType
SELECT * from #TransactionLog

SELECT
    c.CustomerName,
    p.ProductName,
    pt.PaymentTypeName as PaymentType
FROM #TransactionLog t
join #Product p on t.ProductId = p.ProductId
join #Customer c on t.CustomerId = c.CustomerId
join #PaymentType pt on t.PaymentId = pt.PaymentId

DROP TABLE #Customer
DROP TABLE #Product
DROP TABLE #PaymentType
DROP TABLE #TransactionLog

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

Примерно так будет работать. Вам может потребоваться настроить его, если у вас много данных или недостаточно мощный экземпляр базы данных.

;WITH
Data AS(
    SELECT
        c.CustomerName,
        p.ProductName,
        pt.PaymentTypeName as PaymentType
    FROM #TransactionLog t
    join #Product p on t.ProductId = p.ProductId
    join #Customer c on t.CustomerId = c.CustomerId
    join #PaymentType pt on t.PaymentId = pt.PaymentId
)
SELECT DISTINCT
    d.CustomerName,
    d.ProductName,
    PaymentType = IIF( ( (SELECT COUNT(DISTINCT sd.PaymentType) FROM Data sd WHERE sd.CustomerName = d.CustomerName) = 4), 
                    'All', 
                    d.PaymentType
                )
FROM
    Data d
1 голос
/ 06 мая 2020
select CustomerName,case when count(distinct(PaymentType)) = 4 then 'All' end as PaymentType from (SELECT
    c.CustomerName,
    p.ProductName,
    pt.PaymentTypeName as PaymentType
FROM #TransactionLog t
join #Product p on t.ProductId = p.ProductId
join #Customer c on t.CustomerId = c.CustomerId
join #PaymentType pt on t.PaymentId = pt.PaymentId )
group by CustomerName 

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

...