Sql server SQL Server:查询数量

Sql server SQL Server:查询数量,sql-server,Sql Server,表1 ID | DATE | a | 10-07-2012 | b | 10-07-2012 | c | 10-07-2012 | 表2 ID | OrdersID | a | 001 | b | 002 | c | 003 | 表3 ItemID | OrdersID |

表1

ID    |      DATE       |   
 a    |   10-07-2012    |     
 b    |   10-07-2012    |     
 c    |   10-07-2012    | 
表2

ID    |    OrdersID  |
 a    |     001      |
 b    |     002      |
 c    |     003      |
表3

ItemID    |   OrdersID    |  Items |
    1     |     001       |   5    |  
    2     |     002       |   3    |  
    7     |     003       |   2    | 
    3     |     003       |   7    | 
    4     |     001       |   8    |
    2     |     003       |   7    |
    5     |     003       |   6    |   
    6     |     003       |   1    |
表4

 ItemID   | ItemName   |  
    1     |  ABC       |
    2     |  EFG       |
    3     |  HIJ       |
    4     |  KLM       |
    5     |  NOP       |
    6     |  QRS       |
    7     |  TUV       |
我想从
表1
t中选择ID,其中
Date=10-07-2012

在带有ID的
表2
中,我想选择
订单SID

使用
OrdersID
,我想将
ItemID
中的多少项相加,例如
ItemID
2总共有10项

表3
我想知道排名前5位的项目和项目数量,并从
表4
项目名称
获取
项目ID的名称

预期成果5成果

ItemID  |  ItemName  |  Quantity  | 
   2    |  EFG       |     10     | 
   3    |  HIJ       |      7     | 
      .....
  .....
      .....
      .....
开始时使用的SQL

 SELECT SUM (t3.Items) , t4.ItemName
  FROM Table3 t3
  JOIN Table2 t2 ON t3.OrdersID = t2.OrdersID
  JOIN Table1 t1 ON t2.ID = t1.ID
  WHERE t1.[Date] = '10072012 00:00:00'

您只是缺少了一个
groupby
子句,以及一个
JOIN
Table4
中。您的示例结果还包括
ItemID
,因此我将从
表4
中添加它:

 SELECT 
   SUM(t3.Items) , 
   t4.ItemID, 
   t4.ItemName
 FROM 
   Table3 t3
   JOIN Table2 t2 ON t3.OrdersID = t2.OrdersID
   JOIN Table1 t1 ON t2.ID = t1.ID
   JOIN Table4 t4 ON t3.ItemID = t4.ItemID 
 WHERE t1.[Date] = '10072012 00:00:00'
 GROUP BY 
   t4.ItemID, 
   t4.ItemName

根据你想如何打破前五名的关系,这是一个有效的答案

select top 5
    t3.ItemID,
    (select ItemName from TABLE4 as t4 where t4.ItemID = t3.ItemID) as ItemName,
    sum(t3.Items) as Quantity
from TABLE3 as t3
where t3.OrdersID in (
    select OrdersID
    from TABLE1 as t1 inner join TABLE2 as t2 on t2.ID = t1.ID
    where DATE = cast('20121007' as datetime)
)
group by t3.ItemID
order by Quantity desc
这是我得到的结果。请注意,第4项的排名高于第3项,后者与指定的样本输出不匹配

ItemID | ItemName | Quantity  
   2   |    EFG   |    10  
   4   |    KLM   |     8  
   3   |    HIJ   |     7  
   5   |    NOP   |     6  
   1   |    ABC   |     5  

我写了这个解决方案,因为我理解了你的问题。由于您描述它的方式,我在类似的步骤中将其分解,然后才意识到它确实只需要从t2连接到t3,就像在另一个答案中所做的那样。答案应该是相等的。