Monday, March 12, 2012

joining 5 tables

Tables structure:

INVOICE Table TELEVISION Table INV_LINE_ITEM Table

InvoiceDt Type InvoiceNbrFK

InvoiceNbrPK Manufacturer SerialNumberFK

SalesPersonIDFK size Quantity

TotalPrice Weight

CustomerIDFK SerialNumberPK LineNbr

TELEVISION_RETURNED SALESPERSON

SerialNumberFK SalesPersonIDPK

RepairDt Name

ReturnAcknowledge Initial

I need to join several tables to find the salesperson who has sold the most Television type and version that were returned for defect. I need to project this result:

SalesPersonID SalesPerson Name Type+Version Times Returned
- - _ _ _ _ _ _

I started working on some tables to find the type and version of television that were the most returned to the store. I came out with this query:

Select top 1

Type+version ' Type/Version',

count(type+version) 'Time return'

From Television T, Televison_Returned TR, inv_line_item inv, invoice i

Where i.invoicenbr = inv.fk_invoicenbr

and inv.fk_serialNumber = T.serialnumber and inv.fk_SerialNumber = TR.fk_SerialNumber

and TR.fk_serialNbr = T.serialnumber and TR.fk_TelevisionNbr in

(select fk_SerialNumber

from inv_line_item

where fk_invoicenbr in

(Select invoicenbr

from invoice

))

group by type, version

order by count(*) desc;

But I cannot connect the employee table with this query to find the employee who sold this type and version of televison that is always returned for the defect to the store.

Help will be appreciated.

Maybe something like this?

Note that it is possible for more than one salesperson to sell a particularly troublesome type of television, so more than one row will be returned.

Chris

DECLARE @.INVOICE TABLE (InvoiceNbrPK INT, CustomerIDFK INT, SalesPersonIDFK INT)
DECLARE @.TELEVISION TABLE (Type VARCHAR(13), SerialNumberPK INT)
DECLARE @.INV_LINE_ITEM TABLE (InvoiceNbrFK INT, SerialNumberFK INT, Quantity INT)
DECLARE @.CUSTOMER TABLE (CustomerIDPK INT, FName VARCHAR(20), LName VARCHAR(20))

INSERT INTO @.TELEVISION(Type, SerialNumberPK)
SELECT 'Mono', 1 UNION
SELECT 'Colour', 2 UNION
SELECT 'Black & White', 3

INSERT INTO @.INVOICE(InvoiceNbrPK, CustomerIDFK, SalesPersonIDFK)
SELECT 1, 1, 1 UNION
SELECT 2, 2, 2 UNION
SELECT 3, 3, 3 UNION
SELECT 4, 4, 1

INSERT INTO @.CUSTOMER(CustomerIDPK, FName, LName)
SELECT 1, 'Kent', 'Waldrop' UNION
SELECT 2, 'Arnie', 'Rowland' UNION
SELECT 3, 'Louis', 'Davidson' UNION
SELECT 4, 'Umachandar', 'Jayachandran'

--Set up the data so that Kent and Umachander have both bought one of each TV
INSERT INTO @.INV_LINE_ITEM(InvoiceNbrFK, SerialNumberFK, Quantity)
SELECT 1, 1, 3 UNION
SELECT 1, 2, 2 UNION
SELECT 1, 3, 1 UNION
SELECT 2, 2, 5 UNION
SELECT 2, 3, 2 UNION
SELECT 3, 2, 3 UNION
SELECT 4, 1, 1 UNION
SELECT 4, 2, 1 UNION
SELECT 4, 3, 1

DECLARE @.SALESPERSON TABLE (SalesPersonIDPK INT, [Name] VARCHAR(30))
INSERT INTO @.SALESPERSON(SalesPersonIDPK, [Name])
SELECT 1, 'K H Tan' UNION
SELECT 2, 'Konstantin Kosinsky' UNION
SELECT 3, 'lkh'

DECLARE @.TELEVISION_RETURNED TABLE (SerialNumberFK INT)
INSERT INTO @.TELEVISION_RETURNED(SerialNumberFK)
SELECT 1 UNION ALL
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 2 UNION ALL
SELECT 2 UNION ALL
SELECT 3

SELECT x.[SalesPersonID],
x.[SalesPerson Name],
x.[Type],
x.[Count Returned]
FROM
(
SELECT s.SalesPersonIDPK AS [SalesPersonID],
s.[Name] AS [SalesPerson Name],
t.[Type],
cr.[Count Returned]
FROM @.INVOICE i
INNER JOIN @.INV_LINE_ITEM ilt ON ilt.InvoiceNbrFK = i.InvoiceNbrPK
INNER JOIN @.TELEVISION t ON t.SerialNumberPK = ilt.SerialNumberFK
INNER JOIN @.SALESPERSON s ON s.SalesPersonIDPK = SalesPersonIDFK
INNER JOIN (SELECT t.[Type],
COUNT(*) AS [Count Returned]
FROM @.TELEVISION_RETURNED tr
INNER JOIN @.TELEVISION t ON t.SerialNumberPK = tr.SerialNumberFK
GROUP BY [Type]) cr ON cr.[Type] = t.[Type]
GROUP BY s.SalesPersonIDPK, s.[Name], t.[Type], cr.[Count Returned]
) x

INNER JOIN ( SELECT TOP 1
cr.[Type],
cr.[Count Returned] AS [Max Count Returned]
FROM
(SELECT t.[Type],
COUNT(*) AS [Count Returned]
FROM @.TELEVISION_RETURNED tr INNER JOIN @.TELEVISION t ON t.SerialNumberPK = tr.SerialNumberFK
GROUP BY t.[Type]) cr
ORDER BY cr.[Count Returned] DESC) y ON y.[Type] = x.[Type] AND y.[Max Count Returned] = x.[Count Returned]

|||

Hi Chris,

I am going to work on your example and will see what I get as projection. Or either, can there be a simple query to return the salesperson who have sold out more of the defectious TV?

|||

I've just taken another look at the previous example I posted, and it can be simplified slightly. See below.

Chris

DECLARE @.INVOICE TABLE (InvoiceNbrPK INT, CustomerIDFK INT, SalesPersonIDFK INT)
DECLARE @.TELEVISION TABLE (Type VARCHAR(13), SerialNumberPK INT)
DECLARE @.INV_LINE_ITEM TABLE (InvoiceNbrFK INT, SerialNumberFK INT, Quantity INT)
DECLARE @.CUSTOMER TABLE (CustomerIDPK INT, FName VARCHAR(20), LName VARCHAR(20))

INSERT INTO @.TELEVISION(Type, SerialNumberPK)
SELECT 'Mono', 1 UNION
SELECT 'Colour', 2 UNION
SELECT 'Black & White', 3

INSERT INTO @.INVOICE(InvoiceNbrPK, CustomerIDFK, SalesPersonIDFK)
SELECT 1, 1, 1 UNION
SELECT 2, 2, 2 UNION
SELECT 3, 3, 3 UNION
SELECT 4, 4, 1

INSERT INTO @.CUSTOMER(CustomerIDPK, FName, LName)
SELECT 1, 'Kent', 'Waldrop' UNION
SELECT 2, 'Arnie', 'Rowland' UNION
SELECT 3, 'Louis', 'Davidson' UNION
SELECT 4, 'Umachandar', 'Jayachandran'

--Set up the data so that Kent and Umachander have both bought one of each TV
INSERT INTO @.INV_LINE_ITEM(InvoiceNbrFK, SerialNumberFK, Quantity)
SELECT 1, 1, 3 UNION
SELECT 1, 2, 2 UNION
SELECT 1, 3, 1 UNION
SELECT 2, 2, 5 UNION
SELECT 2, 3, 2 UNION
SELECT 3, 2, 3 UNION
SELECT 4, 1, 1 UNION
SELECT 4, 2, 1 UNION
SELECT 4, 3, 1

DECLARE @.SALESPERSON TABLE (SalesPersonIDPK INT, [Name] VARCHAR(30))
INSERT INTO @.SALESPERSON(SalesPersonIDPK, [Name])
SELECT 1, 'K H Tan' UNION
SELECT 2, 'Konstantin Kosinsky' UNION
SELECT 3, 'lkh'

DECLARE @.TELEVISION_RETURNED TABLE (SerialNumberFK INT)
INSERT INTO @.TELEVISION_RETURNED(SerialNumberFK)
SELECT 1 UNION ALL
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 2 UNION ALL
SELECT 2 UNION ALL
SELECT 3

SELECT s.SalesPersonIDPK AS [SalesPersonID],
s.[Name] AS [SalesPerson Name],
t.[Type],
y.[Max Count Returned]
FROM @.INVOICE i
INNER JOIN @.INV_LINE_ITEM ilt ON ilt.InvoiceNbrFK = i.InvoiceNbrPK
INNER JOIN @.TELEVISION t ON t.SerialNumberPK = ilt.SerialNumberFK
INNER JOIN @.SALESPERSON s ON s.SalesPersonIDPK = SalesPersonIDFK
INNER JOIN ( SELECT TOP 1
cr.[Type],
cr.[Count Returned] AS [Max Count Returned]
FROM
(SELECT t.[Type],
COUNT(*) AS [Count Returned]
FROM @.TELEVISION_RETURNED tr
INNER JOIN @.TELEVISION t ON t.SerialNumberPK = tr.SerialNumberFK
GROUP BY t.[Type]) cr
ORDER BY cr.[Count Returned] DESC) y ON y.[Type] = t.[Type]
GROUP BY s.SalesPersonIDPK, s.[Name], t.[Type], y.[Max Count Returned]

No comments:

Post a Comment