仅当存在2个值时才返回行

时间:2015-06-10 06:48:55

标签: sql sql-server-2008

我需要从购买汇总表中返回客户名称列表,但前提是客户在1次交易中购买了2个最终项目。

例如表格'交易'

╔══════════════╦════════╦══════════════╦════════╗
║ CustomerName ║  Item  ║ Transaction# ║ Amount ║
╠══════════════╬════════╬══════════════╬════════╣
║ Smith        ║ Hammer ║            1 ║ 50.00  ║
║ Smith        ║ Nail   ║            1 ║ 4.00   ║
║ Smith        ║ Screw  ║            1 ║ 5.00   ║
║ Brown        ║ Nail   ║            2 ║ 4.00   ║
║ Brown        ║ Screw  ║            2 ║ 4.00   ║
║ Jones        ║ Hammer ║            3 ║ 50.00  ║
║ Jones        ║ Screw  ║            3 ║ 4.00   ║
║ Smith        ║ Nail   ║            4 ║ 50.00  ║
║ Smith        ║ Hammer ║            4 ║ 4.00   ║
║ Smith        ║ Screw  ║            5 ║ 5.00   ║
╚══════════════╩════════╩══════════════╩════════╝

我只想回复在同一笔交易中购买了锤子和螺丝的客户。在同一笔交易中购买其他物品并不重要,我只需要锤子和螺丝的细节,并且只有在同一笔交易中同时存在锤子和螺钉。

所以上面只需要返回:

╔══════════════╦════════╦══════════════╦════════╗
║ CustomerName ║  Item  ║ Transaction# ║ Amount ║
╠══════════════╬════════╬══════════════╬════════╣
║ Smith        ║ Hammer ║            1 ║ 50.00  ║
║ Smith        ║ Screw  ║            1 ║ 5.00   ║
╚══════════════╩════════╩══════════════╩════════╝

因为在同一交易中只有交易1包含锤子和螺钉。

1 个答案:

答案 0 :(得分:2)

使用子选择查找包括Hammer和Screw的交易:

select CustomerName, Item, Transaction#, Amount
from purchase
where Transaction# in (select Transaction# from purchase
                       where Item in ('Hammer', 'Screw')
                       group by Transaction#
                       having count(distinct Item) = 2)

  and  Item in ('Hammer', 'Screw')

如果还应该返回Nail行,则删除最后一行!

相关问题