【问题标题】:Sum of cash and cheque from a table现金和支票的总和
【发布时间】:2019-07-09 14:13:08
【问题描述】:

我需要从销售员订购的两列表格中获取现金和支票金额的总和。

我的桌子是这样的:

Salesman A  Cash    21151
Salesman B  Cash    34510
Salesman C  Cash    21252
Salesman D  Cash    13356
Salesman A  Cheque  13944
Salesman B  Cheque  87368
Salesman C  Cheque  20182
Salesman D  Cheque  23862

SQL:

SELECT Ca.Cash,  Cr.Credit FROM 
    (SELECT Salesman, PayMode, SUM(Collection) AS Cash
        FROM Prospect_Detail WHERE(Purpose = 'Collections') AND (PayMode = 'Cash')
        GROUP BY Salesman, PayMode) AS Ca 
        CROSS JOIN
    (SELECT Salesman, PayMode, SUM(Collection) AS Credit
        FROM Prospect_Detail WHERE(Purpose = 'Collections') AND (PayMode = 'cheque')
        GROUP BY Salesman, PayMode) Cr

我需要得到这样的结果:

Salesman       Cash      Cheque
Salesman A     21151     13944
Salesman B     34510     87368
Salesman C     21252     20182
Salesman D     13356     23862

【问题讨论】:

  • 当前 SQL 的输出是什么?

标签: sql sql-server


【解决方案1】:

您可以尝试以下方法。

create table #Temp (name varchar(50), collectionType varchar(10), amount int)
insert into #Temp values
('Salesman A', 'Cash', 21151),
('Salesman B', 'Cash', 34510),
('Salesman C', 'Cash', 21252),
('Salesman D', 'Cash', 13356),
('Salesman A', 'Cheque', 13944),
('Salesman B', 'Cheque', 87368),
('Salesman C', 'Cheque', 20182),
('Salesman D', 'Cheque', 23862)

SELECT name, Cash, cheque 
FROM  
(SELECT collectionType, name , amount 
    FROM #Temp) AS SourceTable  
PIVOT  
(  
SUM(amount)  
FOR collectionType IN ( Cash ,  Cheque)  
) AS PivotTable;

输出如下图

name        Cash    cheque
--------------------------
Salesman A  21151   13944
Salesman B  34510   87368
Salesman C  21252   20182
Salesman D  13356   23862

您可以找到现场演示Here

【讨论】:

    【解决方案2】:

    转轴的建议对此过于复杂。别理他们。只需使用条件求和。一个简化的例子:

    select Salesman, sum(case Paymode when 'Cash' then Collection else 0 end) as Cash, ...
    from Prospect_Detail 
    where Purpose = 'Collections'
    group by Salesman 
    order by Salesman;
    

    【讨论】:

    • 我没有看到PIVOT 比这更复杂或更简单。秋千和环岛对我来说真的很
    • @MartinSmith 你可能不会,但 OP 提出的问题对于任何有丰富经验的人来说都是相当基本的问题。因此,pivot(这是一个通常以后掌握的命令)对于 IMO 来说过于复杂对于 OP。你必须先走路才能跑。
    【解决方案3】:

    可以使用PIVOT操作符来得到想要的结果:

    DECLARE @tbl TABLE
    (
       SalesMan varchar(50),
       PayType VARCHAR(10),
       Amount INT
    )
    
    INSERT INTO @tbl
    (
        SalesMan,
        PayType,
        Amount
    )
    VALUES
      ('Salesman A', 'Cash',  21151)
    , ('Salesman B', 'Cash',    34510)
    , ('Salesman C', 'Cash',    21252)
    , ('Salesman D', 'Cash',    13356)
    , ('Salesman A', 'Cheque',  13944)
    , ('Salesman B', 'Cheque',  87368)
    , ('Salesman C', 'Cheque',  20182)
    , ('Salesman D', 'Cheque',  23862)
    
    SELECT * 
    FROM 
    (
        SELECT * FROM @tbl
    )AS FooData
    PIVOT(
        AVG(FooData.Amount)
        FOR PayType IN ([Cash], [Cheque])
    ) AS FooPivot
    

    输出:

    SalesMan    Cash    Cheque
    Salesman A  21151   13944
    Salesman B  34510   87368
    Salesman C  21252   20182
    Salesman D  13356   23862
    

    【讨论】:

      【解决方案4】:

      您可以通过以下方式旋转表格

      With c as(
      SELECT Salesman
           , Paymode
           , Sum(Collection) AS Cheque
      FROM 
          Prospect_Detail
      GROUP BY 
            Salesman
          , Paymode
      )
      Select Salesman
            ,[Cash]
            ,[Cheque] 
      From C
      Pivot(
          Sum(Cheque)
          For Paymode in ([Cash],[Cheque]) 
      ) as pvt;
      

      我希望这对你有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多