T-SQL选择每个州的畅销商品

时间:2015-03-19 06:38:24

标签: sql sql-server database tsql

我有多件商品在全国范围内销售和运送。我怎样才能看到每个州最畅销的商品是什么?

CREATE TABLE Customers (
CustomerID Int Not 
, Name Varchar(75) 
, UserName Varchar(75) 
, Password Varchar(75) 
, Email Varchar(75) 
, PrimaryPhone Varchar(50) 
, Primary Key (CustomerID)
)

CREATE TABLE ShippingAddress (
AddressID Int Primary Key
, CustomerID Int 
, Street (75) 
, State Varchar (75)
, Zip Varchar (75) 
,Foreign Key (CustomerID) REFERENCES Customers
)

CREATE TABLE PaymentInfo (
CreditCardNumber Int Primary Key 
, CardExpDate Date 
, CVVCode Int 
, CustomerID Int 
, AddressID Int 
, Foreign Key (CustomerID) REFERENCES Customers
, Foreign Key (AddressID) REFERENCES Addresses
)

CREATE TABLE Orders (
OrderID Int Primary Key
, OrderDate Date 
, CustomerID Int 
, TotalPrice Int 
, Foreign Key (CustomerID) REFERENCES Customers
)

CREATE TABLE Shipping (
ShippingID Int Primary Key 
, OrderID Int 
, AddressID Int 
, Foreign Key (OrderID) REFERENCES Orders
, Foreign Key (AddressID) REFERENCES Addresses
)

CREATE TABLE OrderPayment (
OrderID Int 
, CreditCardNumber Int 
, Primary Key (OrderID, CreditCardNumber)
, Foreign Key (OrderID) REFERENCES Orders 
, Foreign Key (CreditCardNumber) REFERENCES PaymentInfo
)

CREATE TABLE Inventory (
ItemModelNumber Int Primary Key 
, Brand Int 
, ItemDescription Text
, StockQuantity Int 
)

CREATE TABLE OrderItems (
OrderID Int 
, ItemModelNumber Int 
, Primary Key (OrderID, ItemModelNumber)
, Foreign Key (OrderID) REFERENCES Orders
, Foreign Key (ItemModelNumber) REFERENCES Inventory
)


CREATE TABLE Sources (
DistributorID Int Primary Key 
, DistributorName Varchar(75) 
)

CREATE TABLE InventorySource (
ItemModelNumber Int 
, DistributorID Int 
, RequestedDate Date 
, DeliveredDate Date 
, RequestedQuantity Int 
, Primary key (ItemModelNumber, DistributorID)
, Foreign Key (ItemModelNumber) REFERENCES Inventory
, Foreign Key (DistributorID) REFERENCES Sources 
)

GO


CREATE VIEW BestSellers AS(

所以我知道我想从ShippingAddress中选择SELECT DISTINCT状态。然后我想我想从OrderItems表中获取count(ItemModelNumber),OrderID,并将这些列与ShippingAddress表中的Distinct State列连接起来。然后只是关于State的GROUP BY语句。到目前为止这是正确的吗?

1 个答案:

答案 0 :(得分:0)

我认为以下查询为每个州提供了最佳项目

注意:我使用的是COUNT(*),因为我没有找到订单的“数量”字段

SELECT best.*
FROM   (
       SELECT sales.*
            , I.ItemDescription
            , ROW_NUMBER() OVER(PATITION BY sales.State ORDER BY sales.quantity DESC) AS sort
       FROM   (
               SELECT SA.State
                    , OI.ItemModelNumber
                    , COUNT(*) AS quantity
               FROM   OrderItems OI
                   INNER JOIN
                      Shipping   S
                      ON OI.OrderID = S.OrderID
                   INNER JOIN
                      ShippingAddress SA
                      ON S.AddressID = SA.AddressID
               GROUP BY SA.State
                    , OI.ItemModelNumber
               ) sales
           INNER JOIN
               Inventory I
               ON sales.ItemModelNumber = I.Inventory
       ) best
WHERE  best.sort = 1

我希望这会有所帮助

此致