0

関心のある2つの列を持つテーブルがあります

Business_ID   /   Product type

あるタイプを販売し、他のタイプを販売しないビジネスのみを取得する SQL クエリを作成しようとしています。したがって、テーブルには

B_ID    prod_type
123  |   A
123  |   A
123  |   B
234  |   A
234  |   C
234  |   C
456  |   A
456  |   D
789  |   A

そしてリストは延々と続きます。prod_type B、C、D ではなく、prod_type A を販売する B_ID を見つける SQL ステートメントを作成しようとしています。

SELECT phop_1.Business_id, phop_1.PRODUCT_TYPE, count(*) 
FROM phop phop_1, phop phop_2
WHERE phop_1.Business_id = phop_2.Business_id
  AND phop_1.PRODUCT_TYPE = 'A'
  AND NOT phop_2.PRODUCT_TYPE = 'B'
GROUP BY phop_1.Business_id, phop_1.PRODUCT_TYPE

外部結合を使用して除外する方法も見つけましたが、同じテーブルであるため、結合を行う前に prod_type A を選択する方法がない限り、それを行うことはできません。

select phop_1.Business_id, phop_1.PRODUCT_TYPE, count(*) 
from phop phop_1
LEFT OUTER JOIN phop phop_2
ON phop_1.Business_id = phop_2.Business_id
WHERE phop_2.Business_id IS NULL
GROUP BY phop_1.Business_id, phop_1.PRODUCT_TYPE
4

3 に答える 3

2

最初に商品タイプが 1 つしかないビジネスを選択してから、元のテーブルに結合します。

DECLARE @tbl TABLE
    (
     B_ID INT,
     prod_type VARCHAR(100)
    )

INSERT  INTO @tbl
        (B_ID, prod_type)
VALUES  (123, 'A'),
        (123, 'A'),
        (123, 'B'),
        (234, 'A'),
        (234, 'C'),
        (234, 'C'),
        (456, 'A'),
        (456, 'D'),
        (789, 'A') ;

WITH    businessIdsWithOneProductType
          AS (SELECT    B_ID
              FROM      @tbl t
              GROUP BY  B_ID
              HAVING    COUNT(DISTINCT prod_type) = 1)
    SELECT  *
    FROM    businessIdsWithOneProductType
            INNER JOIN @tbl ON businessIdsWithOneProductType.B_ID = [@tbl].B_ID
于 2013-01-30T14:09:04.910 に答える
0
SELECT a.*
FROM    tableName a
        LEFT JOIN tableName b
            ON a.B_ID = b.B_ID AND
                b.prod_type IN ('B','C','D')
WHERE b.B_ID IS NULL
于 2013-01-30T14:04:13.010 に答える