我有一个看起来像这样的查询:
SELECT OrganizationName, OrganizationID, ReceivableStatus, InvoiceFee
FROM v_InvoicesFreelanceOutstanding
ORDER BY OrganizationID
Run Code Online (Sandbox Code Playgroud)
来自的数据可能如下所示:
OrganizationName OrganizationID ReceivableStatus InvoiceFee ----------------------------------------------------------------------------- Company A 139 60-90 days 672.00 Company A 139 60-90 days 1800.00 Company A 139 over 90 days 1440.00 Company B 264 Current 3559.38 Company B 264 60-90 days 3785.50 Company C 271 60-90 days 446.25 Company C 271 over 90 days 637.50 Company C 271 over 90 days 1126.25
我想最终显示的是这样的(对于上面的数据):
Company Current 30-60 days 60-90 days over 90 days Total ----------------------------------------------------------------------------- Company A 0 0 2472.00 0 2472.00 Company B 3559.38 0 3785.50 0 7344.88 Company C 0 0 446.25 1763.75 2210.00
我的SQL-fu还不足以让我超越这个:
SELECT
MAX(OrganizationName) as OrganizationName,
OrganizationID,
ReceivableStatus,
SUM(InvoiceFee) as TotalDue
FROM v_InvoicesFreelanceOutstanding
GROUP BY OrganizationID, ReceivableStatus
Run Code Online (Sandbox Code Playgroud)
这显示了这样的事情(再次,从上面的数据):
OrganizationName OrganizationID ReceivableStatus TotalDue ----------------------------------------------------------------------------- Company A 139 60-90 days 2472.00 Company A 139 over 90 days 1440.00 Company B 264 Current 3559.38 Company B 264 60-90 days 3785.50 Company C 271 60-90 days 446.25 Company C 271 over 90 days 1763.75
然后怎样呢?任何帮助,将不胜感激.
需要注意的是在第二个表(如图所示的状态Current,30-60 days,60-90 days,over 90 days)是唯一我期待拿出下ReceivableStatus.
编辑:很抱歉不包括此内容.我知道PIVOT但我无法做到我想做的事.
ado*_*ic 5
PIVOT很烂。它具有可怕的语法,并且不是透视表中的PIVOT,也就是说,您必须事先确切知道将产生多少列。
进行交叉表报告可能会更容易。
SELECT
OrganizationName,
OrganizationID,
SUM(CASE WHEN ReceivableStatus = '30-60 days' THEN InvoiceFee ELSE 0 END) AS [30 - 60 Days],
SUM(CASE WHEN ReceivableStatus = '60-90 days' THEN InvoiceFee ELSE 0 END) AS [60 - 90 Days],
SUM(CASE WHEN ReceivableStatus = '90-120 days' THEN InvoiceFee ELSE 0 END) AS [90 - 120 Days]
FROM
v_InvoicesFreelanceOutstanding
GROUP BY OrganizationID
Run Code Online (Sandbox Code Playgroud)
pivot如果您使用的是 SQL Server 2005 或更高版本,这看起来像是一项工作。
编辑:
既然您已经了解了pivot,您就知道它几乎可以满足您的需要。
您已经有以下查询:
SELECT
MAX(OrganizationName) as OrganizationName,
OrganizationID,
ReceivableStatus,
SUM(InvoiceFee) as TotalDue
FROM v_InvoicesFreelanceOutstanding
GROUP BY OrganizationID, ReceivableStatus
Run Code Online (Sandbox Code Playgroud)
它为您提供所需的当前、30-60、60-90 和 90+ 零件。如果你以此为中心,你会得到除了总数之外所需的一切。所以只需输入总数即可:
(SELECT
MAX(OrganizationName) as OrganizationName,
OrganizationID,
ReceivableStatus,
SUM(InvoiceFee) as TotalDue
FROM v_InvoicesFreelanceOutstanding
GROUP BY OrganizationID, ReceivableStatus)
UNION
(SELECT
MAX(OrganizationName) as OrganizationName,
OrganizationID,
'Total' AS ReceivableStatus,
SUM(InvoiceFee) as TotalDue
FROM v_InvoicesFreelanceOutstanding
GROUP BY OrganizationID)
Run Code Online (Sandbox Code Playgroud)
以此结果为中心,您应该得到您想要的输出:
SELECT *
FROM
[the query above]
PIVOT (
SUM(TotalDue)
FOR ReceivableStatus IN ([Current],[30-60 days],[60-90 days],[over 90 days],[Total])
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17380 次 |
| 最近记录: |