找回密码
 立即注册

QQ登录

只需一步,快速开始

shnb

中级会员

16

主题

90

帖子

694

积分

中级会员

积分
694

[已处理] 9.0.103

shnb
中级会员   /  发表于:2024-10-21 10:01  /   查看:660  /  回复:12
20金币
情况是这样的:我现在有三个表,一个表A是单位表,字段是单位编号,单位名称,单位余额,一个表B是单位销售表(每天的销售明细),字段是单位编号,销售日期,销售数量,销售金额,一个表C是单位收款表(每天的收款明细),字段是单位编号,收款日期,收款金额,现在我想建立一个视图,字段是单位编号,单位余额,单位总销售数量,单位总回款金额。我主要是纠结在这里:单位余额固然是不会变的,但是我想通过不同的日期段的选择,把该单位该时间的销售总数量和总回款金额体现出来,

最佳答案

查看完整内容

CREATE VIEW UnitSalesView AS SELECT A.UnitID, A.Balance, COALESCE(SUM(B.SalesQuantity), 0) AS TotalSalesQuantity, COALESCE(SUM(C.ReceiptAmount), 0) AS TotalReceiptAmount FROM Units A LEFT JOIN Sales B ON A.UnitID = B.UnitID AND B.SalesDate BETWEEN 'startDate' AND 'endDate' LEFT JOIN Receipts C ON A.UnitID = C.UnitID AND C.ReceiptDate BETWEEN 'startDate' ...

12 个回复

倒序浏览
最佳答案
最佳答案
Y_D
初级会员   /  发表于:2024-10-21 10:01:03
来自 4#
shnb 发表于 2024-10-21 10:42
这个日期有二个日期,一个是销售日期,一个是收款日期,咋整?可否设置日期变量,然后通过变量分别查询销售 ...

CREATE VIEW UnitSalesView AS
SELECT
    A.UnitID,
    A.Balance,
    COALESCE(SUM(B.SalesQuantity), 0) AS TotalSalesQuantity,
    COALESCE(SUM(C.ReceiptAmount), 0) AS TotalReceiptAmount
FROM
    Units A
LEFT JOIN
    Sales B ON A.UnitID = B.UnitID AND B.SalesDate BETWEEN 'startDate' AND 'endDate'
LEFT JOIN
    Receipts C ON A.UnitID = C.UnitID AND C.ReceiptDate BETWEEN 'startDate' AND 'endDate'
GROUP BY
    A.UnitID, A.Balance;

这样可以吗
回复 使用道具 举报
二麻子
中级会员   /  发表于:2024-10-21 10:36:13
2#
你可以给视图加上日期,然后查询视图的时候加上日期限定
回复 使用道具 举报
shnb
中级会员   /  发表于:2024-10-21 10:42:18
3#
本帖最后由 shnb 于 2024-10-21 10:44 编辑

这个日期有二个日期,一个是销售日期,一个是收款日期,咋整?可否设置日期变量,然后通过变量分别查询销售日期和收款日期的数量
回复 使用道具 举报
Syl悬赏达人认证
论坛元老   /  发表于:2024-10-21 11:33:30
5#

单位余额怎么来的?不就是销售减去回款得出来的,
选择不同的日期只能计算出期间内的所有销售和回款,但是余额不会变。

可以按这个思路写视图:

视图取两个查询union,第一个计算余额(按最早日期和选择的最近日期计算余额),第二个计算期间内的销售和回款。
这样选择不同的期间余额和发生都有了


回复 使用道具 举报
Y_D
初级会员   /  发表于:2024-10-21 11:35:52
6#
Syl 发表于 2024-10-21 11:33
单位余额怎么来的?不就是销售减去回款得出来的,
选择不同的日期只能计算出期间内的所有销售和回款,但 ...

CREATE VIEW UnitSalesView AS
(
    SELECT
        A.UnitID,
        A.Balance + COALESCE(SUM(B.SalesQuantity), 0) - COALESCE(SUM(C.ReceiptAmount), 0) AS CurrentBalance
    FROM
        Units A
    LEFT JOIN
        Sales B ON A.UnitID = B.UnitID AND B.SalesDate < @recentDate
    LEFT JOIN
        Receipts C ON A.UnitID = C.UnitID AND C.ReceiptDate < @recentDate
    GROUP BY
        A.UnitID, A.Balance
)
UNION ALL
(
    SELECT
        A.UnitID,
        NULL AS Balance,
        COALESCE(SUM(B.SalesQuantity), 0) AS TotalSalesQuantity,
        COALESCE(SUM(C.ReceiptAmount), 0) AS TotalReceiptAmount
    FROM
        Units A
    LEFT JOIN
        Sales B ON A.UnitID = B.UnitID AND B.SalesDate BETWEEN @startSalesDate AND @endSalesDate
    LEFT JOIN
        Receipts C ON A.UnitID = C.UnitID AND C.ReceiptDate BETWEEN @startReceiptDate AND @endReceiptDate
    GROUP BY
        A.UnitID
);
回复 使用道具 举报
shnb
中级会员   /  发表于:2024-10-21 11:46:31
7#
余额我是通过入帐时就计算出来的,选择不同的日期只能计算出期间内的所有销售和回款,但是余额不会变。我就是要这样的效果。这样就可以把当时的最新余额和某个时间段内的销售和回款的统计数总结到一张表格中,这样方便有时想看余额和销售和回款情况要分别到二个地方去查询了,你的方法我试试,谢谢
回复 使用道具 举报
Levi.Zhang
超级版主   /  发表于:2024-10-21 14:04:29
8#
感谢大佬们对活字格的支持
如果您的问题已解决,请及时更新帖子的状态为“已处理”,并设置最佳答案给有帮助到你的回复;
如果您的问题还未解决,欢迎跟帖补充;
如果您有新的问题,也欢迎创建新的求助帖呦。
回复 使用道具 举报
shnb
中级会员   /  发表于:2024-10-21 15:19:17
9#
我已经初步解决了这个问题,现在把这段SQL上传上来,给大家参考一下。

SELECT 片属编号,单位编号,单位余额,销售.销售日期,收款.收款日期,sum(收款.收款金额) AS "收款金额",sum(销售.销售金额) AS 销售金额,sum(销售.销售折吨) AS 销售数量 FROM 销售单位表
left JOIN  销售 ON 销售单位表.单位编号=销售.销售单位编号
left JOIN  收款 ON 销售单位表.单位编号=收款.收款单位
group by 销售单位表.单位编号
回复 使用道具 举报
Levi.Zhang
超级版主   /  发表于:2024-10-21 15:29:07
10#
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部