当前位置: 首页 > 面试题库 >

行到列和分组

奚高扬
2023-03-14
问题内容

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

SELECT OrganizationName, OrganizationID, ReceivableStatus, InvoiceFee
FROM v_InvoicesFreelanceOutstanding
ORDER BY OrganizationID

来自该数据的数据可能看起来像这样:

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

上面显示了这样的内容(同样,来自上面的数据):

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

然后怎样呢?任何帮助,将不胜感激。

需要注意的是在第二表中所示的状态(Current30-60 days60-90 daysover 90 days)是唯一我期待拿出下ReceivableStatus

编辑 :对不起,不包括此。我知道,PIVOT但我无法让它做我想做的事。


问题答案:

pivot如果您使用的是SQL
Server 2005或更高版本,这看起来像是一项工作。

编辑:

既然您已经了解pivot,您就会知道它几乎可以满足您的需求。

您已经有以下查询:

SELECT
    MAX(OrganizationName) as OrganizationName,
    OrganizationID,
    ReceivableStatus,
    SUM(InvoiceFee) as TotalDue
FROM v_InvoicesFreelanceOutstanding
GROUP BY OrganizationID, ReceivableStatus

这样可以为您提供当前所需的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)

透视此结果,您将获得所需的输出:

SELECT *
FROM 
    [the query above]
PIVOT (
    SUM(TotalDue)
    FOR ReceivableStatus IN ([Current],[30-60 days],[60-90 days],[over 90 days],[Total]) 
)


 类似资料:
  • 问题内容: 请帮我这个: 我想按列TestType分组,但如果它们具有相同的TestType,则应将Result拆分为colunms 我希望SQL以这种格式返回数据 Result#列应该是动态的,因为每个TestType都有很多结果 问题答案: 正如我在评论中所提到的,这里您需要的是或交叉标签;我更喜欢后者,所以我将要使用的东西。 对此的非动态解决方案如下: 但是,问题在于这会将您“锁定”到3个结

  • 需要帮助以下从测试中选择col1、col2、split(col3); 任何regex或PL/SQL函数的想法都可以帮助实现这一点。

  • 我有一个过程对象列表,如下所示 我的程序课就像 我想基于以下条件对对象进行排序和分组。 应根据过程名称对所有过程进行分组。 过程必须按过程日期降序排列。[日期列表中的第一个元素,即 分组在一起的相同过程应按日期降序排列。 最终结果必须是, 我能够使用比较器和旧的Java代码实现这一点。是否可以使用java8流、收集器和分组来实现相同的功能?

  • 问题内容: 这是我的查询 ,列为nvarchar数据类型,为INT数据类型 表格如下 预期结果 在这里,我需要将输出从行转换为列,并找到总计并将其放置在每个范围的最后一列中。 问题答案: 您应该可以使用类似于以下内容的东西: 参见带有演示的SQL Fiddle

  • 问题内容: 有没有一种很好的方法来区分python中的行向量和列向量?到目前为止,我正在使用numpy和scipy,到目前为止,我看到的是,如果我要给一个向量,说 他们无法说天气,我的意思是行或列向量。此外: 在“现实世界”中哪一个根本是不正确的。我意识到上述模块中向量上的大多数功能都不需要区分。例如,或者我想为自己的方便而与众不同。 问题答案: 您可以通过向数组添加另一个维度来明确区分。 现在将

  • 问题内容: 我想选择数据库中的所有行,但希望它们以倒序排列。意思是,我想将第一列数据用作新实体,将当前实体用作第一列。我想你明白我的意思 这是一个例子 至 问题答案: 使用固定的已知列,这里是做这的方法(我将表命名为“ grades”是自由的): 大概的概念: 创建并执行不同查询的并集。 由于您需要实际数据作为列标题,因此联合的第一部分如下所示: 仅该查询将复制结果,因此我们需要通过添加告诉MyS