首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从名称和产品方面获得摘要(和)

如何从名称和产品方面获得摘要(和)
EN

Database Administration用户
提问于 2017-02-21 11:24:45
回答 2查看 236关注 0票数 2

我有三张桌子,

1.收款人

  1. 产品
  1. 付款

付款收集人收集付款产品,并储存在付款表中。产品被分配给付费收集人,有些产品没有分配给收集人。问题是如何检索所有的收集人产品的产品总收集金额的结果应该是,

注意:数据应该是水平方式和垂直方式(两个查询)。

谢谢。

EN

回答 2

Database Administration用户

回答已采纳

发布于 2017-02-21 14:01:52

这是一个很长的过程,但它应该对你有用,完成你想要的。

安装程序

代码语言:javascript
运行
复制
USE [test];
GO;

CREATE TABLE dbo.PaymentCollector
    (
    PaymentCollectorID INT NOT NULL IDENTITY(1,1) PRIMARY KEY
    , CollectorName VARCHAR(100) NULL
    );

CREATE TABLE dbo.Product
    (
    ProductID INT NOT NULL IDENTITY(1,1) PRIMARY KEY
    , ProductName VARCHAR(100) NULL
    );

CREATE TABLE dbo.Payment
    (
    PaymentID INT NOT NULL IDENTITY(1,1) PRIMARY KEY
    , PaymentCollectorID INT NOT NULL REFERENCES dbo.PaymentCollector(PaymentCollectorID)
    , ProductID INT NOT NULL REFERENCES dbo.Product (ProductID)
    , Amount DECIMAL(7,2) NOT NULL
    );

INSERT INTO dbo.PaymentCollector
(CollectorName)
VALUES ('John')
    , ('Anna')
    , ('Lee')
    , ('Andrew');

INSERT INTO dbo.Product
(ProductName)
VALUES ('Card')
    , ('Loan')
    , ('OD');

INSERT INTO dbo.Payment
(PaymentCollectorID, ProductID, Amount)
VALUES (1,1,100.00)
    , (2,3,50.00)
    , (4,1,200.00)
    , (1,2,30.00)
    , (3,2,40.00)
    , (1,3,10.00)
    , (2,2,100.00)
    , (1,3,250.00)
    , (3,2,40.00)
    , (4,3,60.00);

查询1-水平

代码语言:javascript
运行
复制
WITH CTE_Data AS
    (
    SELECT P.PaymentCollectorID
        , P.ProductID
        , SUM(Amount) AS Total
    FROM dbo.Payment AS P
    GROUP BY P.PaymentCollectorID
        , P.ProductID
    )
    , CTE_AllList AS
    (
    SELECT PC.PaymentCollectorID
        , PR.ProductID
    FROM dbo.PaymentCollector AS PC
        CROSS JOIN dbo.Product AS PR
    )
SELECT PC.CollectorName
    , PR.ProductName
    , C.Total
FROM CTE_AllList AS A
    LEFT OUTER JOIN CTE_Data AS C ON C.PaymentCollectorID = A.PaymentCollectorID AND C.ProductID = A.ProductID
    INNER JOIN dbo.Product AS PR ON PR.ProductID = A.ProductID
    INNER JOIN dbo.PaymentCollector AS PC ON PC.PaymentCollectorID = A.PaymentCollectorID;

查询2-垂直(使用数据透视)

代码语言:javascript
运行
复制
WITH CTE_Data AS
    (
    SELECT P.PaymentCollectorID
        , P.ProductID
        , SUM(Amount) AS Total
    FROM dbo.Payment AS P
    GROUP BY P.PaymentCollectorID
        , P.ProductID
    )
    , CTE_AllList AS
    (
    SELECT PC.PaymentCollectorID
        , PR.ProductID
    FROM dbo.PaymentCollector AS PC
        CROSS JOIN dbo.Product AS PR
    )
    , CTE_Pivot AS
    (
    SELECT PC.CollectorName
        , PR.ProductName
        , C.Total
    FROM CTE_AllList AS A
        LEFT OUTER JOIN CTE_Data AS C ON C.PaymentCollectorID = A.PaymentCollectorID AND C.ProductID = A.ProductID
        INNER JOIN dbo.Product AS PR ON PR.ProductID = A.ProductID
        INNER JOIN dbo.PaymentCollector AS PC ON PC.PaymentCollectorID = A.PaymentCollectorID
    )
    SELECT CollectorName, [Card], [Loan], [OD]
    FROM CTE_Pivot
        PIVOT (SUM(Total) FOR ProductName IN ([Card], [Loan], [OD])) AS PT;
票数 1
EN

Database Administration用户

发布于 2017-02-21 13:15:28

这是垂直解决方案:

代码语言:javascript
运行
复制
SELECT     py.Name, py.Product, SUM(Amount) as Total
FROM       Payment py
INNER JOIN Product p ON py.Product = p.Product
INNER JOIN PaymentCollector pc ON py.Name = pc.Name
GROUP BY   py.Name, py.Product
ORDER BY   py.Name, py.Product;

我认为它应该是产品表和PaymentCollector表中的一个product_id,只是为了避免在连接两个表时使用名称。

枢轴表:(水平)

代码语言:javascript
运行
复制
SELECT Name, [Card], [Loan], [OD]
FROM
(SELECT Name, Product , Amount FROM @Payment) AS SourceTable
PIVOT
(
  SUM(Amount) FOR Product IN ([Card], [Loan], [OD])
) AS PivotTable;
票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/165007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档