Sql server SQL Server:查询数量
表1Sql 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 |
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,就像在另一个答案中所做的那样。答案应该是相等的。