【问题标题】:sql select pivot multiple tablessql选择透视多个表
【发布时间】:2017-06-21 21:58:29
【问题描述】:

我见过类似的问题,但没有一个完全符合我想要做的事情。

3 个表:产品、计划、性能。

性能表除了服务于某个目的之外,还表示其他两个表之间的多对多关系。

让我们调用链接字段:

performance.PlanID = plan.PlanID
performance.ProductID = product.ProductID

有 3 个感兴趣的领域:

product.ProductName
plan.Status (Live or Pending)
performance.Capacity

我正在寻找具有以下结果的选择查询:

ProductName
LiveCapacity
PendingCapacity

我尝试在查询的 FROM (SELECT...) 部分中使用所需的内部联接进行支点,但我似乎无法正确处理。

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文? DB2?火鸟?

标签: sql pivot multiple-tables


【解决方案1】:

透视示例。

SELECT 
    t.ProductName,
    [Live] AS LiveCapacity,
    [Pending] AS PendingCapacity
FROM 
(
    SELECT  product.ProductName,
          performance.Capacity,
          plan.Status 
    FROM    product 
          JOIN performance ON performance.ProductID = product.ProductID
          JOIN plan ON performance.PlanID = plan.PlanID
) t
PIVOT (
    SUM(Capacity)
    FOR Status IN ([Live],[Pending])
) p

非枢轴示例

SELECT  product.ProductName,
        SUM(CASE WHEN plan.Status = 'Live' THEN performance.Capacity END) as LiveCapacity,
        SUM(CASE WHEN plan.Status = 'Pending' THEN performance.Capacity END) as PendingCapacity
FROM    product 
        JOIN performance ON performance.ProductID = product.ProductID
        JOIN plan ON performance.PlanID = plan.PlanID
GROUP BY product.ProductName

【讨论】:

  • 这很棒。谢谢。
【解决方案2】:

这样的查询会产生什么结果?

SELECT product.ProductName as Name, plan.Status as Status, 
    performance.Capacity as Capacity
FROM product, plan, performance
WHERE performance.PlanID <> plan.PlanID 
    AND performance.ProductID <> product.ProductID
;

【讨论】:

  • 感谢您的回答。我正在寻找一个支点。
【解决方案3】:

我建议您始终使用显式连接。

从您的 cmets 更新:

SELECT product.ProductName as Name
     , plan.Status as Status
     , SUM(performance.Capacity) as Capacity
FROM product
INNER JOIN plan
   ON performance.PlanID = plan.PlanID
INNER JOIN performance
   ON performance.ProductID = product.ProductID
GROUP BY product.ProductName
       , plan.Status as Status 

【讨论】:

  • 谢谢。我要调整的是两种可能状态的容量总和。
  • 谢谢。我想要改变的是两种可能状态的容量总和。名称 LiveCapacity PendingCapacity -------- ----- ---------- Product1 56 52 Product2 34 30 等。我在我的数据透视查询的 FROM (SELECT....) 部分使用显式连接。我今晚无法从我所在的机器访问工作区,否则我会提交我的完整代码。如果我有选择的话,我根本不会使用选择查询,但我在这个数据库中的权利是有限的。
猜你喜欢
  • 1970-01-01
  • 2010-12-27
  • 2015-07-23
  • 1970-01-01
  • 2011-05-23
  • 2023-04-02
  • 2021-10-20
  • 1970-01-01
  • 2018-10-05
相关资源
最近更新 更多