Сколько фонариков купил Джон Грей?

This is the result I need to achieve:

enter image description here

Пока вот что:

IF NOT (EXISTS (SELECT 
        c.[customerid],
        c.[firstname], 
        c.[lastname],
        cp.[quantity]
    FROM [dbo].[customers] AS c 
    INNER JOIN [dbo].[Customer_Purchases] AS cp
    ON c.[customerid] = cp.[customerid]
    WHERE 
        c.[customerid] = 10101
        AND cp.[item] = 'Flashlight'
    GROUP BY 
        c.[customerid],
        c.[firstname], 
        c.[lastname],
        cp.[quantity]
    )
)BEGIN
    SELECT
        c.[customerid] AS ID,
        c.[firstname] AS First Name, 
        c.[lastname] AS Last Name,
        'Flashlight' AS Item,
        '0' As Quantity
    FROM [dbo].[customers] AS c
    WHERE 
        c.[customerid] = 10101
    GROUP BY 
        c.[customerid],
        c.[firstname], 
        c.[lastname]
END

Какой подход более практичный?

Я прошел через несколько потоков SO относительно таких проблем (this, this, this и this), но необходимое JOIN кажется слишком сложным для меня.

Редактировать 1:

  1. Исправлены несоответствия в коде;
  2. Предоставлены гиперссылки на потоки SO.

I. Я. Newb

Ответов: 2

Ответы (2)

Сколько фонариков купил Джон Грей?

Просто используйте левое соединение:

SELECT c.[customerid], c.[firstname], c.[lastname], 
       COALESCE(SUM(cp.quantity), 0)
FROM dbo.customers c LEFT JOIN
     dbo.Customer_Purchases cp
     ON c.customerid = cp.customerid AND
        cp.item = 'flashlight'
WHERE c.customerid = 10101
GROUP BY c.[customerid], c.[firstname], c.[lastname];

Примечание. Агрегирование по количеству не требуется. Предположительно, вы хотите сложить все количества фонарей. И фильтрация по фонарику (но не по клиенту) должна быть в предложении ON, потому что покупки - это вторая таблица в LEFT JOIN.

SELECT c.[customerid], c.[firstname], c.[lastname],
       sum(case when cp.item = 'flashlight' then cp.quantity else 0 end)
FROM dbo.customers AS c 
LEFT JOIN dbo.Customer_Purchases AS cp ON c.customerid = cp.customerid
WHERE c.customerid = 10101
GROUP BY c.[customerid], c.[firstname], c.[lastname]

2022 WebDevInsider