行进入列和分组

Pao*_*ino 6 sql sql-server

我有一个看起来像这样的查询:

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)


Wel*_*bog 4

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)