一个 SQL 总结不同的 'group by' 级别
One SQL to summarize different 'group by' levels
我在数据库中有一只股票 table:
基于 Stock Table 中的数据,我希望输出更详细的数据:
库存数量表示商品 A 的总库存数量。
位置数量表示每个位置的项目 A 的总数量
子位置数量表示项目 A 的总数量,对于每个子位置的特定位置。
我想知道是否有一种方法可以在一个查询中获得详细的输出,或者我应该单独进行每个查询并编写一些代码来连接每个结果。
我可以写:
为了得到库存数量:
SELECT Item, Sum(Qty) as StockQty
From Stock
Group By Item;
为了得到Location Qty:
SELECT Item, Location, Sum(Qty) as LocationQty
From Stock
Group By Item, Location;
为了获取子位置数量:
SELECT Item, Location, SubLocation, Sum(Qty) as SubLocationQty
From Stock
Group By Item, Location, SubLocation;
然后在后面的代码中,为数据网格视图中的输出编写一些代码。
实际上,我正在寻找一个 returns 一个数据中的所有数据 table 并将其绑定到 datagridview 的查询。
欢迎任何其他解决方案。
我在 AS400 中工作,但如果在其他 DBMS 中有解决方案,请回答,我会尝试使其在我的 DBMS 环境中工作(如果可能)。
您可以为此使用多个子查询。
SELECT Item,
(SELECT StockQty
FROM (SELECT Item, Sum(Qty) AS StockQty
FROM Stock
GROUP BY Item)) AS StockQty
(SELECT LocationQty
FROM (SELECT Item, Location, Sum(Qty) AS LocationQty
FROM Stock
GROUP BY Item, Location)) AS LocationQty,
(SELECT SubLocationQty
FROM (SELECT Item, Location, SubLocation, Sum(Qty) AS SubLocationQty
FROM Stock
GROUP BY Item, Location, SubLocation)) AS SubLocationQty
FROM Stock
试试这个:
SELECT t3.Item, t3.StockQty,
t2.Location, t2.LocationQty,
t1.SubLocation, t1.SubLocationQty
FROM (
SELECT Item, Location, SubLocation, Sum(Qty) as SubLocationQty
From Stock
Group By Item, Location, SubLocation) AS t1
JOIN (
SELECT Item, Location, Sum(Qty) as LocationQty
From Stock
Group By Item, Location
) AS t2 ON t1.Item = t2.Item AND t1.Location = t2.Location
JOIN (
SELECT Item, Sum(Qty) as StockQty
From Stock
Group By Item
) AS t3 ON t1.Item = t3.Item
怎么样:
SELECT Item, Location, SubLocation, Sum(Qty) as SubLocationQty
From Stock
Group By Item, Location, SubLocation with rollup
如果您的 rdbms 中有汇总,那真的很简单。只需将您获得的 'null' 替换为字符串 'Total',您就可以无家可归了......
我在数据库中有一只股票 table:
基于 Stock Table 中的数据,我希望输出更详细的数据:
库存数量表示商品 A 的总库存数量。
位置数量表示每个位置的项目 A 的总数量
子位置数量表示项目 A 的总数量,对于每个子位置的特定位置。
我想知道是否有一种方法可以在一个查询中获得详细的输出,或者我应该单独进行每个查询并编写一些代码来连接每个结果。
我可以写:
为了得到库存数量:
SELECT Item, Sum(Qty) as StockQty From Stock Group By Item;
为了得到Location Qty:
SELECT Item, Location, Sum(Qty) as LocationQty From Stock Group By Item, Location;
为了获取子位置数量:
SELECT Item, Location, SubLocation, Sum(Qty) as SubLocationQty From Stock Group By Item, Location, SubLocation;
然后在后面的代码中,为数据网格视图中的输出编写一些代码。
实际上,我正在寻找一个 returns 一个数据中的所有数据 table 并将其绑定到 datagridview 的查询。
欢迎任何其他解决方案。
我在 AS400 中工作,但如果在其他 DBMS 中有解决方案,请回答,我会尝试使其在我的 DBMS 环境中工作(如果可能)。
您可以为此使用多个子查询。
SELECT Item,
(SELECT StockQty
FROM (SELECT Item, Sum(Qty) AS StockQty
FROM Stock
GROUP BY Item)) AS StockQty
(SELECT LocationQty
FROM (SELECT Item, Location, Sum(Qty) AS LocationQty
FROM Stock
GROUP BY Item, Location)) AS LocationQty,
(SELECT SubLocationQty
FROM (SELECT Item, Location, SubLocation, Sum(Qty) AS SubLocationQty
FROM Stock
GROUP BY Item, Location, SubLocation)) AS SubLocationQty
FROM Stock
试试这个:
SELECT t3.Item, t3.StockQty,
t2.Location, t2.LocationQty,
t1.SubLocation, t1.SubLocationQty
FROM (
SELECT Item, Location, SubLocation, Sum(Qty) as SubLocationQty
From Stock
Group By Item, Location, SubLocation) AS t1
JOIN (
SELECT Item, Location, Sum(Qty) as LocationQty
From Stock
Group By Item, Location
) AS t2 ON t1.Item = t2.Item AND t1.Location = t2.Location
JOIN (
SELECT Item, Sum(Qty) as StockQty
From Stock
Group By Item
) AS t3 ON t1.Item = t3.Item
怎么样:
SELECT Item, Location, SubLocation, Sum(Qty) as SubLocationQty
From Stock
Group By Item, Location, SubLocation with rollup
如果您的 rdbms 中有汇总,那真的很简单。只需将您获得的 'null' 替换为字符串 'Total',您就可以无家可归了......