2012-03-13 11 views
0

私はチケット販売のデータを見ています。取引でのチケットをすべて確認する必要があります。この場合、に少なくとも1つのチケットが割引されています。 1回の取引につき1回のディスカウントしかできませんが、複数のチケットにディスカウントがある場合があります。 (たとえば、AAA割引は最大4枚の大人のチケットに適用できますが、さらに多くのチケットを購入することができます)AAAディスカウントを使用したときに購入されたすべてのチケットのデータが必要です)グループ内の別の行に基づくビューへのフィールドの追加

エンドユーザーは、 Excelを介したビュー、割引タイプと日付に基づくピボットとスライスビューを作成する際に、1つのチケット行のディスカウントコードをトランザクションのすべてのチケットに適用するにはどうすればよいですか?それを行うための方法の

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

答えて

0

一つはチケットや割引や個別の取引番号と割引IDと名前を取得からテーブルを導出して、トランザクション数のチケットに戻って、それに参加することです。これは、実際にトランザクションごとに1つの割引タイプがある場合にのみ機能します。

注:ディスカウントが適用されていないすべてのトランザクションをフィルタリングしている最後の部分。これは、派生テーブルの左結合を内部結合に変更することで実現できます。

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')); 
関連する問題