sql select pivot multiple tables

时间:2017-06-21 21:58:29

标签: sql pivot multiple-tables

我见过类似的问题,但没有一个能够达到我想要的目的。

3个表:产品,计划,表现。

除了服务目的外,性能表代表了另外两个表之间的多对多关系。

让我们调用链接字段:

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

有3个感兴趣的领域:

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

我希望用以下结果编写一个选择查询:

ProductName
LiveCapacity
PendingCapacity

我在查询的FROM(SELECT ...)部分尝试了一个带有所需内连接的数据透视图,但我似乎无法做到正确。

3 个答案:

答案 0 :(得分:0)

这样的查询结果是什么?

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
;

答案 1 :(得分:0)

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

根据您的评论更新:

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 

答案 2 :(得分:0)

透视示例。

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

Non-Pivot示例

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