首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sql透视将%2列转换为行

Sql透视将%2列转换为行
EN

Stack Overflow用户
提问于 2019-08-22 19:31:30
回答 3查看 67关注 0票数 0

我在MsSql 2017中有一个StockLines表。它有几列:

代码语言:javascript
复制
 Product, QuantityInStock, ReservedQuantity.
 CocaCola        50                20

现在,我需要在两行中显示该信息:

代码语言:javascript
复制
Product      Quantity         Reserved
CocaCola        20              true
CocaCola        30              false

可以使用Pivot()来实现吗?我走的是正确的道路吗?附注:我使用的是实体框架核心。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-22 19:44:40

一种简单易懂的方法是UNION:

代码语言:javascript
复制
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语句,可能类似于(未测试):

代码语言:javascript
复制
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

后一种解决方案可能需要一些调整;完全未经测试

票数 1
EN

Stack Overflow用户

发布于 2019-08-22 19:34:55

您可以使用apply轻松完成此操作

代码语言:javascript
复制
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实现了横向连接,这是非常强大的。这只是如何使用它们的一个例子。

票数 2
EN

Stack Overflow用户

发布于 2019-08-22 20:59:34

您可以使用UNPIVOT

代码语言:javascript
复制
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运算符,但使用子查询和别名:

代码语言:javascript
复制
 SELECT Product,
        Quantity,
        Reserved
 FROM   (
            SELECT product,
                   QuantityInStock   AS [false],
                   ReservedQuantity  AS [true]
            FROM   pro
        ) AS tt
        UNPIVOT(Quantity FOR Reserved IN ([false], [true])) upvt
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57608387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档