SQL查询未返回所需的值

时间:2013-03-28 14:50:41

标签: asp.net sql c#-4.0 windows-8 sql-server-2008-r2

我有三张表如下:

CREATE Table [Product]( 
[product_id] int primary key,
[name] varchar(100) not null,
[date] varchar(20) not null,
[quantity] int not null,
[stock] int not null,
[category] varchar(50) not null,
[unitPrice] int not null,
[vendor_id] int not null
)


create table [distribution](
[distribution_id] int primary key,
[showroom] varchar(50) not null,
[quantity] int not null,
[date] varchar(20) not null,
[unitPrice] int not null,
[product_id] int not null
)

create table [sales](
[sales_id] int primary key,
[product_id] int not null, 
[date] varchar(20) not null,
[time] varchar(15) not null,
[quantitiy] int not null,
[cash] int not null,
[branch] varchar(50) not null
)

现在我想创建一个将为每个产品ID返回的查询

[product].product_id, 
[product].unitPrice as 'pUnitPrice', 
[product].quantity, 
[product].unitPrice*[product].quantity as "stockTotal",
SUM([sales].quantitiy) as 'salesUnit', 
[distribution].unitPrice as 'sUnitPrice',
SUM([sales].quantitiy)*[distribution].unitPrice as 'saleTotal', 
[product].quantity-SUM([sales].quantitiy) as 'balance'

我正在使用Microsoft SQL Server 2008 R2在ASP.NET中执行我的项目。我已经进行了查询(追加),但结果错误,可能是检查一个product_id的所有数据。我非常失望......如果有人有时间,请帮助我....请... ...

我的查询:

SELECT 
    [sales].product_id, 
    [product].unitPrice                             as 'pUnitPrice', 
    [product].quantity                              as 'stock', 
    [product].unitPrice * [product].quantity        as "stockTotal", 
    SUM([sales].quantitiy)                          as 'salesUnit',
    [distribution].unitPrice                        as 'sUnitPrice',
    SUM([sales].quantitiy)*[distribution].unitPrice as 'saleTotal',
    [product].quantity-SUM([sales].quantitiy)       as 'balance'
from sales 
JOIN product        ON sales.product_id     = product.product_id
JOIN [distribution] ON [product].product_id = [distribution].product_id 
group by [sales].product_id, 
         [product].unitPrice, 
         [product].quantity, 
         [distribution].unitPrice
order by [sales].product_id 

只有

SUM([sales].quantity)

给出错误。它最多只增加了三次。比如说,期望的数量是4,它变成12,就像每个product_id ....

产品中的值

(product_id,name,date,quantity,stock,category,unitPrice,vendor_id)

(1,HP,2013-03-15,10,6,Laptop,55000,2)

Distribution表中的值:

distribution_id   showroom   quantity      date     unitPrice    product_id
      1            Ritzy1        2      2013-03-02    55000          1
      2            Ritzy2        2      2013-03-02    55000          1
      3            Ritzy3        2      2013-03-02    55000          1

Sales表中的值:

 sales_id   product_id       date       time      quantitiy    cash     branch
    1           1         2013-03-29  7:26:22 PM      2   110000    Ritzy1

我的查询结果

(product_id,    pUnitPrice, stock,  stockTotal, salesUnit,  sUnitPrice, saleTotal,  balance)


(1, 50000,  10, 500000, **6**,  55000,  330000, 4)

期望的输出:

 product_id  pUnitPrice  stock  stockTotal  salesUnit  sUnitPrice  saleTotal  balance
     1         50000       10     500000        2         55000      110000      8

1 个答案:

答案 0 :(得分:0)

您目前无法通过product_id从Distribution表中获取价格,因为可能会在分配表上为同一product_id存储许多不同的价格。对于给定的产品,无法知道每笔销售应使用哪种分销价格。

在您包含的样本数据中,给定产品的所有分配价格都相同。这是你打算如何设计你的系统 - 一个给定的产品总是会有相同的价格,无论它在哪里分发?如果是这样,请从分发表中删除价格并仅将其存储在产品表中。

另一方面,鉴于您当前的设计包含分配表中的价格,并且您的查询试图从分销价格中获得销售价值,这意味着产品的销售价格可能因陈列室而异。这是您打算如何设计您的系统 - 产品将具有不同的销售价格,具体取决于它的分发地点?如果是这样,您需要能够将每个销售记录链接到销售的特定分销 - 这意味着将distribution_id添加到Sales表。

然后,确定销售价格的另一种方法是将销售价格存储在销售记录中 - 从表面上看,这看起来像非正规化,但实际上价格可能会随着时间的推移而变化;除非你想建立一个分销历史表,在每个展厅的哪个时间保存适用价格的详细信息,这将是记录每次销售实际收费的最简单方法。

我之所以询问这是否是家庭作业(包括学期末项目)的原因是,任何这些场景都是对现实生活系统的合理简化,出于学术目的 - 你必须决定哪一个您正在使用/打算使用。 (现实生活中的系统需要更加复杂。)

您的查询返回销售价值比实际销售价值高三倍的原因是因为您将给定产品的所有销售记录链接到同一产品的所有分配,然后将结果汇总 - 因为您有三个分配记录因此,对于销售记录中的产品,您看到实际销售额的三倍。可以重写查询以使其正常工作,但在您决定存储价格的方式时,只能