首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据组中的另一行向视图添加字段

根据组中的另一行向视图添加字段
EN

Stack Overflow用户
提问于 2012-03-13 23:47:45
回答 1查看 40关注 0票数 0

我在看售票数据。我需要查看事务处理( transactions )中的所有票证,其中对(至少一张票证)有折扣。每个交易只允许一个折扣,尽管多张票可能有这个折扣。(例如,AAA折扣最多可适用于4张成人票,尽管可能会购买更多的门票。我需要在使用AAA折扣时购买的所有门票的数据。)

最终用户将通过Excel访问视图中的数据,然后根据折扣类型和日期进行数据透视和切片。在创建视图时,如何将折扣代码从一张票证行应用到事务处理中的所有票证?

代码语言:javascript
复制
SELECT 
    JnlTickets.TransNo,
    JnlHeaders.FiscalDate,
    JnlTickets.DiscNo AS DiscountNumber,
    LEFT(JnlHeaders.agency,1) AS Agency,
    Discounts.Name

FROM dbo.JnlHeaders (nolock) 
    LEFT JOIN dbo.JnlTickets (nolock) 
        ON dbo.JnlHeaders.TranNo=dbo.JnlTickets.TransNo
    LEFT JOIN dbo.Discounts (nolock) 
        ON dbo.JnlTickets.DiscNo=dbo.DISCOUNTS.DiscountID

GROUP BY JnlTickets.TransNo, 
        JnlTickets.DiscNo, 
        JnlHeaders.FiscalDate, 
        LEFT(JnlHeaders.agency,1), 
        Jnltickets.coupons,
        Discounts.Name
HAVING(JnlHeaders.FiscalDate BETWEEN '2012-03-07' AND '2012-03-08')
     AND 
    (Jnltickets.transno IN (SELECT  JnlTickets.TransNo 
                            FROM JnlTickets 
                            WHERE JnlTickets.DiscNo > '1'));
EN

回答 1

Stack Overflow用户

发布于 2012-03-14 00:20:59

这样做的方法之一是从票证和折扣派生一个表,并检索不同的事务号、折扣id和名称,然后将其连接回事务号上的票证。这将只有当你真的只有一个折扣类型的每笔交易。

注:最后一部分过滤掉所有没有折扣的交易。现在可以通过将派生表的左联接更改为内部联接来实现这一点。

代码语言:javascript
复制
SELECT 
    JnlTickets.TransNo,
    JnlHeaders.FiscalDate,
    TransactionsWithDiscounts.DiscNo AS DiscountNumber,
    LEFT(JnlHeaders.agency,1) AS Agency,
    TransactionsWithDiscounts.Name

FROM dbo.JnlHeaders (nolock) 
    LEFT JOIN dbo.JnlTickets (nolock) 
        ON dbo.JnlHeaders.TranNo=dbo.JnlTickets.TransNo
    left join
    (
       select distinct JnlTickets.TransNo, JnlTickets.DiscNo, Discounts.Name
         from dbo.JnlTickets (nolock) 
             LEFT JOIN dbo.Discounts (nolock) 
               ON dbo.JnlTickets.DiscNo = dbo.DISCOUNTS.DiscountID
        where JnlTickets.DiscNo > '1' -- or is not null? 
    ) TransactionsWithDiscounts
      ON JnlTickets.TransNo = TransactionsWithDiscounts.TransNo
GROUP BY JnlTickets.TransNo, 
        TransactionsWithDiscounts.DiscNo, 
        JnlHeaders.FiscalDate, 
        LEFT(JnlHeaders.agency,1), 
        Jnltickets.coupons,
        TransactionsWithDiscounts.Name
HAVING(JnlHeaders.FiscalDate BETWEEN '2012-03-07' AND '2012-03-08')
     AND 
    (Jnltickets.transno IN (SELECT  JnlTickets.TransNo 
                            FROM JnlTickets 
                            WHERE JnlTickets.DiscNo > '1'));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9693935

复制
相关文章

相似问题

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