【问题标题】:Joining table issue with SQL Server 2008SQL Server 2008 的连接表问题
【发布时间】:2012-11-28 14:50:07
【问题描述】:

我正在使用以下查询来获取一些销售数据。问题是它返回了错误的数据。

我将三个表连接在一起tbl_orderstbl_orderitemstbl_paymenttbl_orders 表保存摘要信息,tbl_orderitems 保存订购的项目,tbl_payment 表保存有关订单的付款信息。每个订单可以多次付款。

我正在尝试获取物品的总和 sum(mon_orditems_pprice),以及售出物品的数量 count(uid_orderitems)

当我针对特定订单号运行以下查询时,我知道该订单号有 1 个订单商品。它返回计数 2 和两项之和。

Item                       ProdTotal    ProdCount
Westvale Climbing Frame    1198         2

此订单在tbl_payment 表中保存了两条付款记录,这导致了重复计数。如果我删除付款表加入,它会报告正确的数字,或者如果我选择一个具有单笔付款的订单,它也可以工作。我是不是错过了什么,我累了!!??

SELECT 
  txt_orditems_pname,
  SUM(mon_orditems_pprice) AS prodTotal,
  COUNT(uid_orderitems) AS prodCount
FROM dbo.tbl_orders
  INNER JOIN dbo.tbl_orderitems ON (dbo.tbl_orders.uid_orders = dbo.tbl_orderitems.uid_orditems_orderid)
  INNER JOIN dbo.tbl_payment ON (dbo.tbl_orders.uid_orders = dbo.tbl_payment.uid_pay_orderid)
WHERE
  uid_orditems_orderid = 61571
GROUP BY
  dbo.tbl_orderitems.txt_orditems_pname
ORDER BY
  dbo.tbl_orderitems.txt_orditems_pname

有什么建议吗?

谢谢。

向下钻取表格列

dbo.tbl_payment.bit_pay_paid (1/0) Has this payment been paid, yes no
dbo.tbl_orders.bit_order_archive (1/0) Is this order archived, yes no
dbo.tbl_orders.uid_order_webid (integer) Web Shop's ID
dbo.tbl_orders.bit_order_preorder (1/0) Is this a pre-order, yes no
YEAR(dbo.tbl_orders.dte_order_stamp) (2012) Sales year
dbo.tbl_orders.txt_order_status (varchar) Is the order dispatched, awaiting delivery
dbo.tbl_orderitems.uid_orditems_pcatid (integer) Product category ID

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:

    这是一种正常行为,如果您删除分组子句,您会看到加入后确实有 2 行,并且它们都有 599 作为 mon_orditems_pprice,因此 SUM 是正确的。当任何连接表中存在多重匹配时,整个输出行将变为多重,并且正在求和(或以任何其他方式计算或聚合)的数据也将多次求和。试试这个:

    SELECT      txt_orditems_pname,
                SUM(mon_orditems_pprice) AS prodTotal,
                COUNT(uid_orderitems) AS prodCount
    FROM        dbo.tbl_orders
    INNER JOIN  dbo.tbl_orderitems ON (dbo.tbl_orders.uid_orders = dbo.tbl_orderitems.uid_orditems_orderid)
    INNER JOIN  
    (
        SELECT  x.uid_pay_orderid
        FROM    dbo.tbl_payment x
        GROUP   BY x.uid_pay_orderid
    ) AS payments ON (dbo.tbl_orders.uid_orders = payments.uid_pay_orderid)
    
    WHERE
      uid_orditems_orderid = 61571
    GROUP BY
      dbo.tbl_orderitems.txt_orditems_pname
    ORDER BY
      dbo.tbl_orderitems.txt_orditems_pname
    

    我不知道您使用的是来自tbl_payment 的哪些数据,SELECT 列表中的任何列实际上来自tbl_payment 吗?为什么要加入tbl_payment

    【讨论】:

    • 感谢您的回复,mon_orditems_pprice is from tbl_orditems` 表。感谢您的领导,尽管我会调整并报告。
    • 嗨,Ivan,我正在使用支付表来挖掘将包含在 where 语句中的数据。
    • 嗨杰森。我在查询中编写它的方式不会再导致多行,但它也没有用(没有执行数据或过滤,只是加入)。尝试举例说明您需要来自tbl_payments 的哪些数据或过滤...
    • 抱歉,Ivan 我只是想让查询先运行。付款表包含付款状态信息,即已付款、定金付款、最终付款等,我只是要放一个诸如WHERE dbo.tbl_payment.txt_pay_status = 'Paid' 之类的 where 语句?有没有更有效的方法来做到这一点? PS。我真的很感谢你的帮助!!谢谢。
    • 好的,所以您只想要已付款的订单?例如,是否有可能在 tbl_payment 中有 2 行用于单个订单,其中一个具有 txt_pay_status Paid 而另一个具有其他值?您是否只需要所有付款状态为Paid 的订单?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多