我在看售票数据。我需要查看事务处理( transactions )中的所有票证,其中对(至少一张票证)有折扣。每个交易只允许一个折扣,尽管多张票可能有这个折扣。(例如,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'));发布于 2012-03-14 00:20:59
这样做的方法之一是从票证和折扣派生一个表,并检索不同的事务号、折扣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'));https://stackoverflow.com/questions/9693935
复制相似问题