【问题标题】:Select multiple records from same table从同一个表中选择多条记录
【发布时间】:2011-09-17 17:23:03
【问题描述】:

我正在尝试编写一个从表中选择两个不同结果的查询。

让我们假设以下是餐桌销售:

 Supp                           items
 A                                 1
 A                                 1
 A                                 3
 A                                -1 //negative represent return item
 B                                 1

我想选择销售产品和退货产品的总和。所以结果如下:

Supp  Sale  Return
A       5      1
B       1      0

我正在尝试跟踪查询,但没有得到想要的结果

select 
t.Supp, count(t.items)'Quantity', count(s.items)'ReturnedQuantity'  
from sale t, sale s  
where t.items='1' and s.items='-1'
group by
   t.supp,s.supp   
order by
  sum(cast(t.items as int)) desc

有人能告诉我要查询什么来得到这个结果吗?

【问题讨论】:

    标签: sql-server sql-server-2005 tsql


    【解决方案1】:
    SELECT 
          Supp
        , SUM( CASE WHEN items > 0 
                    THEN items
                    ELSE 0
               END
             )
          AS SoldQuantity
        , - SUM( CASE WHEN items < 0 
                      THEN items
                      ELSE 0
                 END
               )
          AS ReturnedQuantity
    FROM sale   
    GROUP BY Supp   
    ORDER BY SoldQuantity DESC         --- or ORDER BY Supp
                                       --- whatever is needed
    

    原始查询出了什么问题:

    首先,当你应该使用SUM()时,你使用COUNT()

    其次,您加入表sale 的两个实例。如果您使用了t.items &gt;0 AND s.items &lt; 0,这可能会起作用,但它会更复杂,您还需要t.supp = s.supp。不必要的复杂性(即使那样它也可能不起作用)。

    第三,where t.items='1' and s.items='-1' 条件不会对具有不同于1-1 的项目的任何行求和。并且你有一些不同的东西,比如3

    【讨论】:

    • 谢谢!请告诉我。我的查询出了什么问题?
    • 这一个仍然有负数的回报,而不是正数,而且它也不是按销售顺序排序的(我知道这是次要的):)
    【解决方案2】:
    SELECT t.Supp AS 'Supp', SUM(t.items) AS 'Sale', SUM(t.return_items) AS 'Return'  FROM           (
        SELECT Supp AS Supp,
        CASE WHEN items < 0 THEN 0 ELSE items END AS items,
        CASE WHEN items > 0 THEN 0 ELSE -items END AS return_items
        FROM tb_Test
    ) AS t
    GROUP BY t.Supp
    ORDER BY 'Sale' desc
    

    【讨论】:

    • @Zain,您对左侧为 1 且右侧为 -1 的列进行交叉连接和过滤,但这种方式完全忽略了具有 3 的列。然后您按两列分组所以它就像你计算对......基本上你的查询有很多问题:)
    猜你喜欢
    • 2021-03-11
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    相关资源
    最近更新 更多