Sql server sql查询透视
我想按时段排列OrderValue的总和。我的SQL查询现在以表格格式显示,我希望它在一行中。如果OrderValue到期日在本期,则应在第0列下,如果下个月到期,则必须在第1列下,依此类推。请查看我的SQL查询Sql server sql查询透视,sql-server,tsql,pivot,Sql Server,Tsql,Pivot,我想按时段排列OrderValue的总和。我的SQL查询现在以表格格式显示,我希望它在一行中。如果OrderValue到期日在本期,则应在第0列下,如果下个月到期,则必须在第1列下,依此类推。请查看我的SQL查询 ALTER PROCEDURE [dbo].[sp_GetInvoicedPayments] @CustomerID int AS BEGIN DECLARE @endOfCurrentMonth DATE = EOMONTH(GETDATE()) SELECT [dat
ALTER PROCEDURE [dbo].[sp_GetInvoicedPayments]
@CustomerID int
AS
BEGIN
DECLARE @endOfCurrentMonth DATE = EOMONTH(GETDATE())
SELECT [data].CustomerID, [data].[Period], SUM([data].OrderValue) AS
OrderValue
FROM (
SELECT pms.CustomerID, pms.OrderValue,
CASE
WHEN ((SELECT CAST(pms.ExpectedDate AS DATE)) <= paymentInfo.CurrentDueMonth) THEN 0
WHEN ((SELECT CAST(pms.ExpectedDate AS DATE)) <= DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0, DATEADD(MONTH, 1, paymentInfo.CurrentDueMonth)) + 1,- 1)) ) THEN 1
WHEN ((SELECT CAST(pms.ExpectedDate AS DATE)) <= DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0, DATEADD(MONTH, 2, paymentInfo.CurrentDueMonth)) + 1,- 1))) THEN 2
WHEN ((SELECT CAST(pms.ExpectedDate AS DATE)) <= DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0, DATEADD(MONTH, 3, paymentInfo.CurrentDueMonth)) + 1,- 1))) THEN 3
WHEN ((SELECT CAST(pms.ExpectedDate AS DATE)) <= DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0, DATEADD(MONTH, 4, paymentInfo.CurrentDueMonth)) + 1,- 1))) THEN 4
END AS [Period]
FROM PaymentMilestoneSummary pms
INNER JOIN (
SELECT cus.ID AS CustomerID,
CASE
WHEN cus.PaymentStatusID = 1 THEN @endOfCurrentMonth
WHEN cus.PaymentStatusID = 2 THEN (SELECT CAST(DATEADD(month, - 1, @endOfCurrentMonth) AS DATE))
WHEN cus.PaymentStatusID = 3 THEN (SELECT CAST(DATEADD(month, - 2, @endOfCurrentMonth) AS DATE))
WHEN cus.PaymentStatusID = 4 THEN (SELECT CAST(DATEADD(month, - 3, @endOfCurrentMonth) AS DATE))
WHEN cus.PaymentStatusID = 5 THEN (SELECT CAST(DATEADD(month, - 4, @endOfCurrentMonth) AS DATE))
END AS CurrentDueMonth
FROM Company cus
) paymentInfo ON pms.CustomerID = paymentInfo.CustomerID AND paymentInfo.CustomerID= @CustomerID
)[data]
GROUP BY [data].CustomerID, [data].[Period]
END
这就是我得到的:
这是我希望的一个例子:
您可以使用PIVOT和CTE执行以下操作 你的程序应该是这样的
ALTER PROCEDURE [dbo].[sp_GetInvoicedPayments]
@CustomerID int
AS
BEGIN
DECLARE @endOfCurrentMonth DATE = EOMONTH(GETDATE())
;with CTE AS
(
SELECT [data].CustomerID, [data].[Period], SUM([data].OrderValue) AS
OrderValue
FROM (
SELECT pms.CustomerID, pms.OrderValue,
CASE
WHEN ((SELECT CAST(pms.ExpectedDate AS DATE)) <= paymentInfo.CurrentDueMonth) THEN 0
WHEN ((SELECT CAST(pms.ExpectedDate AS DATE)) <= DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0, DATEADD(MONTH, 1, paymentInfo.CurrentDueMonth)) + 1,- 1)) ) THEN 1
WHEN ((SELECT CAST(pms.ExpectedDate AS DATE)) <= DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0, DATEADD(MONTH, 2, paymentInfo.CurrentDueMonth)) + 1,- 1))) THEN 2
WHEN ((SELECT CAST(pms.ExpectedDate AS DATE)) <= DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0, DATEADD(MONTH, 3, paymentInfo.CurrentDueMonth)) + 1,- 1))) THEN 3
WHEN ((SELECT CAST(pms.ExpectedDate AS DATE)) <= DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0, DATEADD(MONTH, 4, paymentInfo.CurrentDueMonth)) + 1,- 1))) THEN 4
END AS [Period]
FROM PaymentMilestoneSummary pms
INNER JOIN (
SELECT cus.ID AS CustomerID,
CASE
WHEN cus.PaymentStatusID = 1 THEN @endOfCurrentMonth
WHEN cus.PaymentStatusID = 2 THEN (SELECT CAST(DATEADD(month, - 1, @endOfCurrentMonth) AS DATE))
WHEN cus.PaymentStatusID = 3 THEN (SELECT CAST(DATEADD(month, - 2, @endOfCurrentMonth) AS DATE))
WHEN cus.PaymentStatusID = 4 THEN (SELECT CAST(DATEADD(month, - 3, @endOfCurrentMonth) AS DATE))
WHEN cus.PaymentStatusID = 5 THEN (SELECT CAST(DATEADD(month, - 4, @endOfCurrentMonth) AS DATE))
END AS CurrentDueMonth
FROM Company cus
) paymentInfo ON pms.CustomerID = paymentInfo.CustomerID AND paymentInfo.CustomerID= @CustomerID
)[data]
GROUP BY [data].CustomerID, [data].[Period]
)
SELECT [0], [1], [2], [3], [4]
FROM
(select Period, OrderValue from cte) AS SourceTable
PIVOT
(
max(OrderValue)
FOR Period IN ([0], [1], [2], [3], [4])
) AS PivotTable;
END
请再说一件事,我如何总结从这一行得到的值?
ALTER PROCEDURE [dbo].[sp_GetInvoicedPayments]
@CustomerID int
AS
BEGIN
DECLARE @endOfCurrentMonth DATE = EOMONTH(GETDATE())
;with CTE AS
(
SELECT [data].CustomerID, [data].[Period], SUM([data].OrderValue) AS
OrderValue
FROM (
SELECT pms.CustomerID, pms.OrderValue,
CASE
WHEN ((SELECT CAST(pms.ExpectedDate AS DATE)) <= paymentInfo.CurrentDueMonth) THEN 0
WHEN ((SELECT CAST(pms.ExpectedDate AS DATE)) <= DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0, DATEADD(MONTH, 1, paymentInfo.CurrentDueMonth)) + 1,- 1)) ) THEN 1
WHEN ((SELECT CAST(pms.ExpectedDate AS DATE)) <= DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0, DATEADD(MONTH, 2, paymentInfo.CurrentDueMonth)) + 1,- 1))) THEN 2
WHEN ((SELECT CAST(pms.ExpectedDate AS DATE)) <= DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0, DATEADD(MONTH, 3, paymentInfo.CurrentDueMonth)) + 1,- 1))) THEN 3
WHEN ((SELECT CAST(pms.ExpectedDate AS DATE)) <= DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0, DATEADD(MONTH, 4, paymentInfo.CurrentDueMonth)) + 1,- 1))) THEN 4
END AS [Period]
FROM PaymentMilestoneSummary pms
INNER JOIN (
SELECT cus.ID AS CustomerID,
CASE
WHEN cus.PaymentStatusID = 1 THEN @endOfCurrentMonth
WHEN cus.PaymentStatusID = 2 THEN (SELECT CAST(DATEADD(month, - 1, @endOfCurrentMonth) AS DATE))
WHEN cus.PaymentStatusID = 3 THEN (SELECT CAST(DATEADD(month, - 2, @endOfCurrentMonth) AS DATE))
WHEN cus.PaymentStatusID = 4 THEN (SELECT CAST(DATEADD(month, - 3, @endOfCurrentMonth) AS DATE))
WHEN cus.PaymentStatusID = 5 THEN (SELECT CAST(DATEADD(month, - 4, @endOfCurrentMonth) AS DATE))
END AS CurrentDueMonth
FROM Company cus
) paymentInfo ON pms.CustomerID = paymentInfo.CustomerID AND paymentInfo.CustomerID= @CustomerID
)[data]
GROUP BY [data].CustomerID, [data].[Period]
)
SELECT [0], [1], [2], [3], [4]
FROM
(select Period, OrderValue from cte) AS SourceTable
PIVOT
(
max(OrderValue)
FOR Period IN ([0], [1], [2], [3], [4])
) AS PivotTable;
END
SELECT
[0], [1], [2], [3], [4] , s as [Sum]
FROM
(select Period, OrderValue, sum(OrderValue) over() s from cte) AS SourceTable
PIVOT
(
max(OrderValue)
FOR Period IN ([0], [1], [2], [3], [4])
) AS PivotTable;