加入两个PIVOT表

时间:2014-02-10 20:49:12

标签: sql sql-server-2008 tsql

我有这个查询

With 
NoOfOrder as 
(
    SELECT  Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec,Jan,Feb,Mar
    FROM 
    (
        select LEFT(datename(month,InvoiceDate),3) mon,InvoiceNo as InvoiceNo
        from tbl_InvoiceMain ,tbl_OrderMain,tbl_CompanyMaster    
        where tbl_InvoiceMain.OrderID = tbl_OrderMain.OrderID
        and (CAST(tbl_InvoiceMain.InvoiceDate AS date) BETWEEN tbl_CompanyMaster.YearStart  AND tbl_CompanyMaster.YearEnd)
    ) P
    PIVOT (count(InvoiceNo)for mon in (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)) PV 
),
OnTime as
(
    SELECT  Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec,Jan,Feb,Mar
    FROM 
    (
        select LEFT(datename(month,InvoiceDate),3) mon,InvoiceNo as InvoiceNo
        from tbl_InvoiceMain ,tbl_OrderMain,tbl_CompanyMaster    
        where tbl_InvoiceMain.OrderID = tbl_OrderMain.OrderID
        and (CAST(tbl_InvoiceMain.InvoiceDate AS date) BETWEEN tbl_CompanyMaster.YearStart  AND tbl_CompanyMaster.YearEnd)
        and  CAST(tbl_InvoiceMain.InvoiceDate AS date) <= CAST(tbl_OrderMain.ScheduledDispatchDate AS date)
    ) P
    PIVOT (count(InvoiceNo)for mon in (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)) PV 
)
Select * From NoOfOrder
union all
Select * From OnTime 

它给出了这个结果:

Apr May Jun Jul Aug Sep Oct Nov Dec Jan Feb Mar
18  35  39  52  32  47  47  22  14  0   0   0
9   10  16  22  6   11  19  10  5   0   0   0

这是我的预期结果

                       Apr      May      Jun     Jul     Aug     Sep     Oct     Nov     Dec     Jan     Feb     Mar
NoOfOrder              18       35       39      52      32      47      47      22      14      0       0       0
OnTimeDelivered        9        10       16      22      6       11      19      10      5       0       0       0
DeliverPerformance%    50.00    28.57    41.03   42.31   18.75   23.40   40.43   45.45   35.71   0.00    0.00    0.00

DeliverPerformance的公式是:

DeliverPerformance% = (OnTimeDelivered/NoOfOrder) X 100

如何在下一行实现此结果? 作为参考,你以良好的格式检查我的问题 enter link description here

1 个答案:

答案 0 :(得分:0)

我的直接建议是在旋转结果之前先将所有内容合并。

您的第一个查询可能如下所示:

SELECT 
    LEFT(datename(month, InvoiceDate), 3) InvMon, 
    SUM(1) AS NoOfOrder,
    SUM(CASE WHEN CAST(tbl_InvoiceMain.InvoiceDate AS date) <= CAST(tbl_OrderMain.ScheduledDispatchDate AS date) THEN 1 ELSE 0 END) OnTimeDelivered
FROM tbl_InvoiceMain, tbl_OrderMain, tbl_CompanyMaster    
WHERE tbl_InvoiceMain.OrderID = tbl_OrderMain.OrderID
    AND (CAST(tbl_InvoiceMain.InvoiceDate AS date) BETWEEN tbl_CompanyMaster.YearStart AND tbl_CompanyMaster.YearEnd)
GROUP BY LEFT(datename(month, InvoiceDate), 3)

请注意,我一直在计算每张发票记录,并可选择使用CASE语句和相应的SUM函数计算“准时”发票。

我的下一个想法是将该查询放入CTE,然后使用该CTE的语句将执行额外的计算,如下所示:

SELECT InvMon, NoOfOrder, OnTimeDelivered, ((OnTimeDelivered / NoOfOrder) * 100) DeliverPerformance ...

最后,这就是我的转折点。