试图找到最受欢迎的项目销售SQL的状态

时间:2018-03-21 15:59:31

标签: sql sql-server tsql

真的很难获得我需要的数字。 我需要预测出售大多数炉灶的州。

我有:

SELECT DISTINCT TOP 2 C.StateProvince,
       COUNT(*) AS TimesSold
FROM CUSTOMER C 
INNER JOIN INVOICE I ON C.CustomerID = I.FK_CustomerID
INNER JOIN INV_LINE_ITEM L ON I.InvoiceNbr = L.FK_InvoiceNbr
FULL OUTER JOIN STOVE S ON S.SerialNumber = L.FK_StoveNbr
GROUP BY C.StateProvince, L.FK_StoveNbr
ORDER BY TimesSold DESC;

我得到的输出是:

State  Count
------ -----
OR      20
MT      16

但我需要的输出是:

State  Count
------ -----
OR      20
CO      9

这让我相信我不算正确的事情。

数据包括:

CUSTOMER (CustomerID, Name, StreetAddress, ApartmentNbr, City, 
          StateProvince, Zipcode, Country)

INVOICE (InvoiceNbr, InvoiceDt, TotalPrice, FK_CustomerID, FK_EmpID)

EMPLOYEE (EmpID, Name, Title, Initials)

INV_LINE_ITEM (LineNbr, Quantity, FK_InvoiceNbr, FK_PartNbr, 
               FK_StoveNbr, ExtendedPrice)

STOVE (SerialNumber, Type, Version, DateOfManufacture, Color, FK_EmpID)

3 个答案:

答案 0 :(得分:0)

{Knee-jerk reaction}改变这个

按TimesSold DESC订购;

到这个

按COUNT排序(*)DESC;

答案 1 :(得分:0)

我认为你在寻找:

SELECT DISTINCT TOP 2 C.StateProvince, COUNT(*) AS TimesSold
FROM CUSTOMER C INNER JOIN
     INVOICE I
     ON C.CustomerID = I.FK_CustomerID INNER JOIN
     INV_LINE_ITEM L
     ON I.InvoiceNbr = L.FK_InvoiceNbr INNER JOIN
     STOVE S
     ON S.SerialNumber = L.FK_StoveNbr
GROUP BY C.StateProvince
ORDER BY TimesSold DESC;

我认为问题是GROUP BY。但是,FULL OUTER JOIN无效。

答案 2 :(得分:0)

这只是你查询格式化的
需要使用明确是一个问题的明确指示
炉子上的完全外部连接什么都不做 - 如果SerialNumber不是唯一的,它可能会破坏东西 始终按列报告组

SELECT DISTINCT TOP 2 
       C.StateProvince, COUNT(*) AS TimesSold
FROM CUSTOMER C 
INNER JOIN INVOICE I 
   ON C.CustomerID = I.FK_CustomerID
INNER JOIN INV_LINE_ITEM L 
   ON I.InvoiceNbr = L.FK_InvoiceNbr
FULL OUTER JOIN STOVE S 
   ON S.SerialNumber = L.FK_StoveNbr
GROUP BY C.StateProvince, L.FK_StoveNbr
ORDER BY TimesSold DESC;

如果你运行它,你应该看到你的问题

SELECT C.StateProvince, L.FK_StoveNbr, COUNT(*) AS TimesSold
FROM CUSTOMER C 
INNER JOIN INVOICE I 
   ON C.CustomerID = I.FK_CustomerID
INNER JOIN INV_LINE_ITEM L 
   ON I.InvoiceNbr = L.FK_InvoiceNbr
GROUP BY C.StateProvince, L.FK_StoveNbr
ORDER BY C.StateProvince, L.FK_StoveNbr;

如果加入炉灶只是为了找到炉子,那就把它作为内部连接。