Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从现有查询中取消PIVOT_Sql_Sql Server_Sql Server 2012_Unpivot - Fatal编程技术网

Sql 从现有查询中取消PIVOT

Sql 从现有查询中取消PIVOT,sql,sql-server,sql-server-2012,unpivot,Sql,Sql Server,Sql Server 2012,Unpivot,我有以下疑问: select'Amount' as Amount, ('£'+ CAST(SUM(rc.[Fee Charge] +rc.[Fee Charge VAT] +rc.ExtraCharges+rc.ExtraChargesVAT+rc.OtherCharges+rc.OtherChargesVAT+rc.WaitingCharge+rc.[WaitingCharge VAT])AS nvarchar(50))) AS [CompletedTurnover], ('£'+ CAST(

我有以下疑问:

select'Amount' as Amount,
('£'+ CAST(SUM(rc.[Fee Charge] +rc.[Fee Charge VAT] +rc.ExtraCharges+rc.ExtraChargesVAT+rc.OtherCharges+rc.OtherChargesVAT+rc.WaitingCharge+rc.[WaitingCharge VAT])AS nvarchar(50))) AS [CompletedTurnover],
('£'+ CAST(SUM(rin.[Fee Charge] +rin.[Fee Charge VAT] +rin.ExtraCharges+rin.ExtraChargesVAT+rin.OtherCharges+rin.OtherChargesVAT+rin.WaitingCharge+rin.[WaitingCharge VAT])AS nvarchar(50))) AS [In Progress Turnover],
('£'+ CAST(SUM(run.[Fee Charge] +run.[Fee Charge VAT] +run.ExtraCharges+rc.ExtraChargesVAT+run.OtherCharges+run.OtherChargesVAT+run.WaitingCharge+run.[WaitingCharge VAT])AS nvarchar(50))) AS [Unallocated Turnover],
123 as [Credit Note Value]


from tblreservation R 
left join tblreservation rc on R.ReservationsID = rc.reservationsid and rc.Completed = 1
left join tblreservation rin on R.reservationsid = rin.reservationsid and rin.InProgress = 1
left join tblreservation run on Run.ReservationsID = r.ReservationsID and run.completed = 0 and run.inprogress = 0
这将返回如下数据:

CompletedTurnover      In progress Turnover      Unallocated Turnover       Credit Note Value    
1202039920             23998858945               9384585845                 123
这是意料之中的。但是,我需要以下输出,并且我在使用枢轴方面有点困难

  Completed Turnover    1202039920             
  In Progress Turnover  23998858945               
  Unallocated Turnover  9384585845                 
  Credit Note Value     123

任何帮助都将不胜感激。

您可以使用工会获得所需的结果:

select 'Completed turnover' Description, 
        (  '£'+ CAST(SUM(rc.[Fee Charge] +
                     rc.[Fee Charge VAT] + 
                     rc.ExtraCharges+
                     rc.ExtraChargesVAT+
                     rc.OtherCharges+
                     rc.OtherChargesVAT+
                     rc.WaitingCharge+
                     rc.[WaitingCharge VAT]
                   )AS nvarchar(50))) value
from ....

union all

select 'In Progress turnover', .....
from ....

union all

select 'Unallocated Turnover', .....
from ....

您可能希望结合使用一个

,您可以使用一个联合来获得所需的结果:

select 'Completed turnover' Description, 
        (  '£'+ CAST(SUM(rc.[Fee Charge] +
                     rc.[Fee Charge VAT] + 
                     rc.ExtraCharges+
                     rc.ExtraChargesVAT+
                     rc.OtherCharges+
                     rc.OtherChargesVAT+
                     rc.WaitingCharge+
                     rc.[WaitingCharge VAT]
                   )AS nvarchar(50))) value
from ....

union all

select 'In Progress turnover', .....
from ....

union all

select 'Unallocated Turnover', .....
from ....
您可能想看看与a一起使用,试试这个

select'Amount' as Amount
union all
select
('£'+ CAST(SUM(rc.[Fee Charge] +rc.[Fee Charge VAT] +rc.ExtraCharges+rc.ExtraChargesVAT+rc.OtherCharges+rc.OtherChargesVAT+rc.WaitingCharge+rc.[WaitingCharge VAT])AS nvarchar(50))) AS [CompletedTurnover]
from tblreservation rc where Completed=1
union all

select
('£'+ CAST(SUM(rin.[Fee Charge] +rin.[Fee Charge VAT] +rin.ExtraCharges+rin.ExtraChargesVAT+rin.OtherCharges+rin.OtherChargesVAT+rin.WaitingCharge+rin.[WaitingCharge VAT])AS nvarchar(50))) AS [In Progress Turnover]
from tblreservation rin  where InProgress=1
union all
select
('£'+ CAST(SUM(run.[Fee Charge] +run.[Fee Charge VAT] +run.ExtraCharges+rc.ExtraChargesVAT+run.OtherCharges+run.OtherChargesVAT+run.WaitingCharge+run.[WaitingCharge VAT])AS nvarchar(50))) AS [Unallocated Turnover]
from tblreservation run where InProgress=0 and Completed=0
union all
 select 123 as [Credit Note Value]
试试这个

select'Amount' as Amount
union all
select
('£'+ CAST(SUM(rc.[Fee Charge] +rc.[Fee Charge VAT] +rc.ExtraCharges+rc.ExtraChargesVAT+rc.OtherCharges+rc.OtherChargesVAT+rc.WaitingCharge+rc.[WaitingCharge VAT])AS nvarchar(50))) AS [CompletedTurnover]
from tblreservation rc where Completed=1
union all

select
('£'+ CAST(SUM(rin.[Fee Charge] +rin.[Fee Charge VAT] +rin.ExtraCharges+rin.ExtraChargesVAT+rin.OtherCharges+rin.OtherChargesVAT+rin.WaitingCharge+rin.[WaitingCharge VAT])AS nvarchar(50))) AS [In Progress Turnover]
from tblreservation rin  where InProgress=1
union all
select
('£'+ CAST(SUM(run.[Fee Charge] +run.[Fee Charge VAT] +run.ExtraCharges+rc.ExtraChargesVAT+run.OtherCharges+run.OtherChargesVAT+run.WaitingCharge+run.[WaitingCharge VAT])AS nvarchar(50))) AS [Unallocated Turnover]
from tblreservation run where InProgress=0 and Completed=0
union all
 select 123 as [Credit Note Value]

将列转换为行的过程实际上被称为UNPIVOT。你可以用几种不同的方法来做

UNPIVOT:功能:

;with cte as
(
  select'Amount' as Amount,
    ('£'+ CAST(SUM(rc.[Fee Charge] +rc.[Fee Charge VAT] +rc.ExtraCharges+rc.ExtraChargesVAT+rc.OtherCharges+rc.OtherChargesVAT+rc.WaitingCharge+rc.[WaitingCharge VAT])AS nvarchar(50))) AS [CompletedTurnover],
    ('£'+ CAST(SUM(rin.[Fee Charge] +rin.[Fee Charge VAT] +rin.ExtraCharges+rin.ExtraChargesVAT+rin.OtherCharges+rin.OtherChargesVAT+rin.WaitingCharge+rin.[WaitingCharge VAT])AS nvarchar(50))) AS [In Progress Turnover],
    ('£'+ CAST(SUM(run.[Fee Charge] +run.[Fee Charge VAT] +run.ExtraCharges+rc.ExtraChargesVAT+run.OtherCharges+run.OtherChargesVAT+run.WaitingCharge+run.[WaitingCharge VAT])AS nvarchar(50))) AS [Unallocated Turnover],
    123 as [Credit Note Value]
  from tblreservation R 
  left join tblreservation rc 
    on R.ReservationsID = rc.reservationsid 
    and rc.Completed = 1
  left join tblreservation rin 
    on R.reservationsid = rin.reservationsid 
    and rin.InProgress = 1
  left join tblreservation run 
    on Run.ReservationsID = r.ReservationsID 
    and run.completed = 0 
    and run.inprogress = 0
)
select col, value
from cte 
unpivot
(
  value
  for col in (CompletedTurnover, [In Progress Turnover],
              [Unallocated Turnover], [Credit Note Value])
) u;
与值交叉应用:

;with cte as
(
  select'Amount' as Amount,
    ('£'+ CAST(SUM(rc.[Fee Charge] +rc.[Fee Charge VAT] +rc.ExtraCharges+rc.ExtraChargesVAT+rc.OtherCharges+rc.OtherChargesVAT+rc.WaitingCharge+rc.[WaitingCharge VAT])AS nvarchar(50))) AS [CompletedTurnover],
    ('£'+ CAST(SUM(rin.[Fee Charge] +rin.[Fee Charge VAT] +rin.ExtraCharges+rin.ExtraChargesVAT+rin.OtherCharges+rin.OtherChargesVAT+rin.WaitingCharge+rin.[WaitingCharge VAT])AS nvarchar(50))) AS [In Progress Turnover],
    ('£'+ CAST(SUM(run.[Fee Charge] +run.[Fee Charge VAT] +run.ExtraCharges+rc.ExtraChargesVAT+run.OtherCharges+run.OtherChargesVAT+run.WaitingCharge+run.[WaitingCharge VAT])AS nvarchar(50))) AS [Unallocated Turnover],
    123 as [Credit Note Value]
  from tblreservation R 
  left join tblreservation rc 
    on R.ReservationsID = rc.reservationsid 
    and rc.Completed = 1
  left join tblreservation rin 
    on R.reservationsid = rin.reservationsid 
    and rin.InProgress = 1
  left join tblreservation run 
    on Run.ReservationsID = r.ReservationsID 
    and run.completed = 0 
    and run.inprogress = 0
)
select col, value
from cte 
cross apply
(
  values
    ('CompletedTurnover', CompletedTurnover),
    ('In Progress Turnover', [In Progress Turnover]),
    ('Unallocated Turnover', [Unallocated Turnover]),
    ('Credit Note Value', [Credit Note Value])
) c (col, value)

将列转换为行的过程实际上被称为UNPIVOT。你可以用几种不同的方法来做

UNPIVOT:功能:

;with cte as
(
  select'Amount' as Amount,
    ('£'+ CAST(SUM(rc.[Fee Charge] +rc.[Fee Charge VAT] +rc.ExtraCharges+rc.ExtraChargesVAT+rc.OtherCharges+rc.OtherChargesVAT+rc.WaitingCharge+rc.[WaitingCharge VAT])AS nvarchar(50))) AS [CompletedTurnover],
    ('£'+ CAST(SUM(rin.[Fee Charge] +rin.[Fee Charge VAT] +rin.ExtraCharges+rin.ExtraChargesVAT+rin.OtherCharges+rin.OtherChargesVAT+rin.WaitingCharge+rin.[WaitingCharge VAT])AS nvarchar(50))) AS [In Progress Turnover],
    ('£'+ CAST(SUM(run.[Fee Charge] +run.[Fee Charge VAT] +run.ExtraCharges+rc.ExtraChargesVAT+run.OtherCharges+run.OtherChargesVAT+run.WaitingCharge+run.[WaitingCharge VAT])AS nvarchar(50))) AS [Unallocated Turnover],
    123 as [Credit Note Value]
  from tblreservation R 
  left join tblreservation rc 
    on R.ReservationsID = rc.reservationsid 
    and rc.Completed = 1
  left join tblreservation rin 
    on R.reservationsid = rin.reservationsid 
    and rin.InProgress = 1
  left join tblreservation run 
    on Run.ReservationsID = r.ReservationsID 
    and run.completed = 0 
    and run.inprogress = 0
)
select col, value
from cte 
unpivot
(
  value
  for col in (CompletedTurnover, [In Progress Turnover],
              [Unallocated Turnover], [Credit Note Value])
) u;
与值交叉应用:

;with cte as
(
  select'Amount' as Amount,
    ('£'+ CAST(SUM(rc.[Fee Charge] +rc.[Fee Charge VAT] +rc.ExtraCharges+rc.ExtraChargesVAT+rc.OtherCharges+rc.OtherChargesVAT+rc.WaitingCharge+rc.[WaitingCharge VAT])AS nvarchar(50))) AS [CompletedTurnover],
    ('£'+ CAST(SUM(rin.[Fee Charge] +rin.[Fee Charge VAT] +rin.ExtraCharges+rin.ExtraChargesVAT+rin.OtherCharges+rin.OtherChargesVAT+rin.WaitingCharge+rin.[WaitingCharge VAT])AS nvarchar(50))) AS [In Progress Turnover],
    ('£'+ CAST(SUM(run.[Fee Charge] +run.[Fee Charge VAT] +run.ExtraCharges+rc.ExtraChargesVAT+run.OtherCharges+run.OtherChargesVAT+run.WaitingCharge+run.[WaitingCharge VAT])AS nvarchar(50))) AS [Unallocated Turnover],
    123 as [Credit Note Value]
  from tblreservation R 
  left join tblreservation rc 
    on R.ReservationsID = rc.reservationsid 
    and rc.Completed = 1
  left join tblreservation rin 
    on R.reservationsid = rin.reservationsid 
    and rin.InProgress = 1
  left join tblreservation run 
    on Run.ReservationsID = r.ReservationsID 
    and run.completed = 0 
    and run.inprogress = 0
)
select col, value
from cte 
cross apply
(
  values
    ('CompletedTurnover', CompletedTurnover),
    ('In Progress Turnover', [In Progress Turnover]),
    ('Unallocated Turnover', [Unallocated Turnover]),
    ('Credit Note Value', [Credit Note Value])
) c (col, value)

您可能不需要联接,因为聚合结果来自同一个表。您可以改为使用条件聚合

SELECT
  SUM(CASE WHEN Completed = 1 THEN
    [Fee Charge] + [Fee Charge VAT] + ExtraCharges + ExtraChargesVAT +
    OtherCharges + OtherChargesVAT + WaitingCharge + [WaitingCharge VAT]
  END) AS [Completed Turnover],
  SUM(CASE WHEN InProgress = 1 THEN
    ...
  END) AS [In-progress Turnover],
  SUM(CASE WHEN Completed = 0 AND InProgress = 0 THEN
    ...
  END) AS [Unallocated Turnover],
  123 AS [Credit Note Value]
FROM tblreservation
然后使用@BlueFoots答案中的任一方法取消打印结果:

SELECT
  Caption,
  Value
FROM (
  SELECT
    SUM(CASE WHEN Completed = 1 THEN
      [Fee Charge] + [Fee Charge VAT] + ExtraCharges + ExtraChargesVAT +
      OtherCharges + OtherChargesVAT + WaitingCharge + [WaitingCharge VAT]
    END) AS [Completed Turnover],
    SUM(CASE WHEN InProgress = 1 THEN
      ...
    END) AS [In-progress Turnover],
    SUM(CASE WHEN Completed = 0 AND InProgress = 0 THEN
      ...
    END) AS [Unallocated Turnover],
    123 AS [Credit Note Value]
  FROM tblreservation
) AS s
UNPIVOT (
  Value FOR Caption IN (
    [Completed Turnover], [In-progress Turnover],
    [Unallocated Turnover], [Credit Note Value]
  )
) AS u
;
另一方面,如果
InProgress
Completed
始终为1或0,并且它们具有一致的值,即它们不能都为1,则可以按如下方式对结果进行分组:

SELECT
  Completed,
  InProgress,
  SUM(
    [Fee Charge] + [Fee Charge VAT] + ExtraCharges + ExtraChargesVAT +
    OtherCharges + OtherChargesVAT + WaitingCharge + [WaitingCharge VAT]
  ) AS Value
FROM tblreservation
GROUP BY
  Completed,
  InProgress
下一步是将
Completed
InProgress
的组合转换为正确的标题。一种方法是使用用例:

SELECT
  CASE
    WHEN Completed  = 1 THEN 'Completed Turnover'
    WHEN InProgress = 1 THEN 'In-progress Turnover'
    ELSE                     'Unallocated Turnover'
  END AS Caption
  SUM(
    [Fee Charge] + [Fee Charge VAT] + ExtraCharges + ExtraChargesVAT +
    OtherCharges + OtherChargesVAT + WaitingCharge + [WaitingCharge VAT]
  ) AS Value
FROM tblreservation
GROUP BY
  Completed,
  InProgress
然后,您只需将常量
贷方票据值
与UNION ALL相加:

SELECT
  CASE
    WHEN Completed  = 1 THEN 'Completed Turnover'
    WHEN InProgress = 1 THEN 'In-progress Turnover'
    ELSE                     'Unallocated Turnover'
  END AS Caption
  SUM(
    [Fee Charge] + [Fee Charge VAT] + ExtraCharges + ExtraChargesVAT +
    OtherCharges + OtherChargesVAT + WaitingCharge + [WaitingCharge VAT]
  ) AS Value
FROM tblreservation
GROUP BY
  Completed,
  InProgress

UNION ALL

SELECT
  'Credit Note Value',
  123
;

您可能不需要联接,因为聚合结果来自同一个表。您可以改为使用条件聚合

SELECT
  SUM(CASE WHEN Completed = 1 THEN
    [Fee Charge] + [Fee Charge VAT] + ExtraCharges + ExtraChargesVAT +
    OtherCharges + OtherChargesVAT + WaitingCharge + [WaitingCharge VAT]
  END) AS [Completed Turnover],
  SUM(CASE WHEN InProgress = 1 THEN
    ...
  END) AS [In-progress Turnover],
  SUM(CASE WHEN Completed = 0 AND InProgress = 0 THEN
    ...
  END) AS [Unallocated Turnover],
  123 AS [Credit Note Value]
FROM tblreservation
然后使用@BlueFoots答案中的任一方法取消打印结果:

SELECT
  Caption,
  Value
FROM (
  SELECT
    SUM(CASE WHEN Completed = 1 THEN
      [Fee Charge] + [Fee Charge VAT] + ExtraCharges + ExtraChargesVAT +
      OtherCharges + OtherChargesVAT + WaitingCharge + [WaitingCharge VAT]
    END) AS [Completed Turnover],
    SUM(CASE WHEN InProgress = 1 THEN
      ...
    END) AS [In-progress Turnover],
    SUM(CASE WHEN Completed = 0 AND InProgress = 0 THEN
      ...
    END) AS [Unallocated Turnover],
    123 AS [Credit Note Value]
  FROM tblreservation
) AS s
UNPIVOT (
  Value FOR Caption IN (
    [Completed Turnover], [In-progress Turnover],
    [Unallocated Turnover], [Credit Note Value]
  )
) AS u
;
另一方面,如果
InProgress
Completed
始终为1或0,并且它们具有一致的值,即它们不能都为1,则可以按如下方式对结果进行分组:

SELECT
  Completed,
  InProgress,
  SUM(
    [Fee Charge] + [Fee Charge VAT] + ExtraCharges + ExtraChargesVAT +
    OtherCharges + OtherChargesVAT + WaitingCharge + [WaitingCharge VAT]
  ) AS Value
FROM tblreservation
GROUP BY
  Completed,
  InProgress
下一步是将
Completed
InProgress
的组合转换为正确的标题。一种方法是使用用例:

SELECT
  CASE
    WHEN Completed  = 1 THEN 'Completed Turnover'
    WHEN InProgress = 1 THEN 'In-progress Turnover'
    ELSE                     'Unallocated Turnover'
  END AS Caption
  SUM(
    [Fee Charge] + [Fee Charge VAT] + ExtraCharges + ExtraChargesVAT +
    OtherCharges + OtherChargesVAT + WaitingCharge + [WaitingCharge VAT]
  ) AS Value
FROM tblreservation
GROUP BY
  Completed,
  InProgress
然后,您只需将常量
贷方票据值
与UNION ALL相加:

SELECT
  CASE
    WHEN Completed  = 1 THEN 'Completed Turnover'
    WHEN InProgress = 1 THEN 'In-progress Turnover'
    ELSE                     'Unallocated Turnover'
  END AS Caption
  SUM(
    [Fee Charge] + [Fee Charge VAT] + ExtraCharges + ExtraChargesVAT +
    OtherCharges + OtherChargesVAT + WaitingCharge + [WaitingCharge VAT]
  ) AS Value
FROM tblreservation
GROUP BY
  Completed,
  InProgress

UNION ALL

SELECT
  'Credit Note Value',
  123
;

伊恩,干杯,这似乎是一个更好的方法。当我有能力的时候我会接受的。伊恩干杯,这似乎是一个更好的方式。我能接受的时候就接受。