【问题标题】:Adding a field to a view based on another row in the group根据组中的另一行将字段添加到视图
【发布时间】:2012-03-14 08:20:59
【问题描述】:

我正在查看门票销售数据。我需要查看对至少一张票应用了折扣的所有交易中的票。每笔交易只允许一个折扣,但多张门票可能有该折扣。 (例如,AAA 折扣最多可应用于 4 张成人票,但可以购买更多票。我需要使用 AAA 折扣时购买的所有票的数据。)

最终用户将通过 Excel 访问视图中的数据,然后根据折扣类型和日期进行透视和切片。在创建视图时,如何将一个票行中的折扣代码应用于交易中的所有票?

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'));

【问题讨论】:

    标签: sql view


    【解决方案1】:

    其中一种方法是从门票和折扣中派生一个表,并检索不同的交易编号以及折扣 ID 和名称,然后将其加入到交易编号的门票中。仅当您确实每笔交易只有一种折扣类型时,这才有效。

    注意:过滤掉所有未应用折扣的交易的最后一部分。现在可以通过将派生表的左连接更改为内连接来实现。

    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'));
    

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 2016-09-19
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多