我在MsSql 2017中有一个StockLines表。它有几列:
Product, QuantityInStock, ReservedQuantity.
CocaCola 50 20现在,我需要在两行中显示该信息:
Product Quantity Reserved
CocaCola 20 true
CocaCola 30 false可以使用Pivot()来实现吗?我走的是正确的道路吗?附注:我使用的是实体框架核心。
发布于 2019-08-22 19:44:40
一种简单易懂的方法是UNION:
SELECT product, reservedquantity as quantity, 'true' as reserved FROM stocklines
UNION ALL
SELECT product, quantityinstock-reservedquantity, 'false' FROM stocklines我想知道,如果你们在表格中有其他行,详细说明同一产品的其他预订,它们也应该来自总数吗?所有行的库存数量是否相同?希望所有单独的产品预订都组合在一起,这样库存行表就可以为每个产品包含一行(否则事情会变得混乱)。
您还提到您正在使用ef核心-请参阅https://docs.microsoft.com/en-us/ef/core/querying/raw-sql
此技术也可以修改为LINQ语句,可能类似于(未测试):
context.StockLines.Select(s => new[] { new {
s.Product,
Quantity = s.QuantityInStock - s.ReservedQuantity,
Reserved = false
},
new {
s.Product,
Quantity = s.ReservedQuantity,
Reserved = true
}
}).SelectMany().ToList()其思想是,我们将每条记录拆分为一个匿名类型和一个非保留类型,前者表示保留的类型,后者表示非保留的类型,作为第一次选择的数组输出,然后使用selectmany将类型的枚举扁平化为类型的enunerable
后一种解决方案可能需要一些调整;完全未经测试
发布于 2019-08-22 19:34:55
您可以使用apply轻松完成此操作
select t.product, v.quantity, v.reserved
from t cross apply
(values (t.ReservedQuantity, 'true'),
(t.QuantityInStock - t.ReservedQuantity, 'false')
) v(quantity, reserved);我认为你可以使用unpivot来做这件事,但那是多余的语法。apply实现了横向连接,这是非常强大的。这只是如何使用它们的一个例子。
发布于 2019-08-22 20:59:34
您可以使用UNPIVOT
SELECT Product,
Quantity,
CASE Reserved
WHEN 'QuantityInStock' THEN 'FALSE'
ELSE 'TRUE'
END AS Reserved
FROM pro
UNPIVOT(
Quantity FOR Reserved IN (QuantityInStock, ReservedQuantity)
) AS t另一种方法是不使用CASE运算符,但使用子查询和别名:
SELECT Product,
Quantity,
Reserved
FROM (
SELECT product,
QuantityInStock AS [false],
ReservedQuantity AS [true]
FROM pro
) AS tt
UNPIVOT(Quantity FOR Reserved IN ([false], [true])) upvthttps://stackoverflow.com/questions/57608387
复制相似问题