1
Product Name    Product Id  Product Status
A               1           Rollout
A               1           Storage
A               1           Delivered
A               5           Storage
B               2           Rollout
C               3           Rollout
A               4           Rollout
A               5           Rollout
B               6           Rollout
C               7           Rollout

上の表では、次のような結果を返すクエリの下に書きたいと思います

Product Name QOH
A            1
B            0
C            0

クエリ:

SELECT Product Name, Count(Product Id) 
FROM table_t1 
WHERE Product Status IN ('Storage') AND Product Status NOT IN ('Delivered')

しかし、上記のクエリは次の結果を返します

Product Name QOH
A            2
B            0
C            0

助けてください。

4

5 に答える 5

2

次のクエリを使用できるはずです。

select distinct t.[product name], 
  coalesce(p.QOH, 0) QOH
from yourtable t
left join
(
  select t1.[product name], count(*) QOH
  from yourtable t1
  where [Product Status] = 'Storage'
    and not exists (select [product id]
                    from yourtable t2
                    where [Product Status] = 'Delivered'
                      and t1.[product id] = t2.[product id])
  group by t1.[product name]
) p
  on t.[product name] = p.[product name]

デモで SQL Fiddle を参照してください

元のクエリの問題は、製品が同時に 2 つのステータスを持つことができないことです。Storageとと の両方のステータスを持つ行を返そうとしましたがDelivered、これは論理的に不可能です。

のステータスの行を返すサブクエリを使用しましたStorageproduct id、テーブルにはステータスの別の行もありませんDelivered(これは句not exists内にあります)。where

これらの結果が得られたら、テーブルに結合して、すべての個別の製品を返す必要があります。

このクエリの結果は次のとおりです。

| PRODUCT NAME | QOH |
----------------------
|            A |   1 |
|            B |   0 |
|            C |   0 |
于 2013-03-27T11:36:40.307 に答える
0

最初に【商品状況】で絞り込んでいるので、BとCは見えません。グループ化を使用する必要があります。

Select 
    [Product Name]
    ,QOH = sum(case when [Product Status]='Storage' then 1 else 0 end)
group by 
    [Product Name]
于 2013-03-27T11:19:00.367 に答える
0

不必要な結合や関数呼び出しなしで、同様のバリアントを提案できます-

DECLARE @temp TABLE
(
      ProductName CHAR(1)    
    , ProductID INT  
    , ProductStatus VARCHAR(10)
)

INSERT INTO @temp (ProductName, ProductID, ProductStatus)
VALUES 
    ('A', 1, 'Rollout'),
    ('A', 1, 'Storage'),
    ('A', 1, 'Delivered'),
    ('A', 5, 'Storage'),
    ('B', 2, 'Rollout'),
    ('C', 3, 'Rollout'),
    ('A', 4, 'Rollout'),
    ('A', 5, 'Rollout'),
    ('B', 6, 'Rollout'),
    ('C', 7, 'Rollout')

SELECT 
      t.ProductName 
    , [Count] = COUNT(1)
FROM @temp t
WHERE t.ProductStatus = 'Storage'
    AND NOT EXISTS ( 
        SELECT 1
        FROM @temp t2
        WHERE t2.ProductStatus = 'Delivered'
            AND t.ProductID = t2.ProductID 
    )
GROUP BY ALL t.ProductName
于 2013-04-04T12:17:40.220 に答える
0
SELECT ProductName, count(distinct ProductID)
from(
SELECT ProductName, ProductID
FROM Table_1
GROUP BY ProductName, ProductID
HAVING MAX(ProductStatus)='Storage' 
and MIN(ProductStatus)<>'Delivered')
X
GROUP BY ProductName
于 2013-03-29T10:03:51.053 に答える