2016-07-14 13 views
1

この質問は数回答えられましたが、それまでデータが存在しない間は余分な行を追加することができません。T-SQLデータが存在しないときにゼロで行を追加する

DECLARE @Test TABLE 

(
ID NVARCHAR(10) 
,Number INT 

) 
INSERT INTO @Test VALUES ('TG32',6) 
INSERT INTO @Test VALUES ('TG32',6) 
INSERT INTO @Test VALUES ('TG32',6) 
INSERT INTO @Test VALUES ('TG32',2) 
INSERT INTO @Test VALUES ('QD65',2) 
INSERT INTO @Test VALUES ('QD65',3) 
INSERT INTO @Test VALUES ('QD65',3) 
INSERT INTO @Test VALUES ('HT76',7) 
INSERT INTO @Test VALUES ('HT76',1) 
INSERT INTO @Test VALUES ('HT76',5) 

SELECT CASE WHEN ID = 'TG32' THEN 'Hats' 
      WHEN ID = 'QD65' THEN 'Coats' 
      WHEN ID = 'HT76' THEN 'Shoes' 
      WHEN ID = 'WR52' THEN 'Shirts' END 
      , Number 


FROM @Test 

私はそこになるまでのID WR52のためのデータが存在しない間、シャツに0を言う結果に余分な行を取得しようとしていますか?

enter image description here

答えて

1

あなたは第二のテーブルを宣言し、あなたのカテゴリが常に表示されていることを確認するために参加し、左を使用することができ、この

DECLARE @Test TABLE 
(
ID NVARCHAR(10) 
,Number INT 

) 
INSERT INTO @Test VALUES ('TG32',6) 
INSERT INTO @Test VALUES ('TG32',6) 
INSERT INTO @Test VALUES ('TG32',6) 
INSERT INTO @Test VALUES ('TG32',2) 
INSERT INTO @Test VALUES ('QD65',2) 
INSERT INTO @Test VALUES ('QD65',3) 
INSERT INTO @Test VALUES ('QD65',3) 
INSERT INTO @Test VALUES ('HT76',7) 
INSERT INTO @Test VALUES ('HT76',1) 
INSERT INTO @Test VALUES ('HT76',5) 

-- 
SELECT CASE WHEN ID = 'TG32' THEN 'Hats' 
      WHEN ID = 'QD65' THEN 'Coats' 
      WHEN ID = 'HT76' THEN 'Shoes' 
      WHEN ID = 'WR52' THEN 'Shirts' END 
      , Number 
FROM @Test 

UNION ALL 

SELECT 'Shirts', 0 
WHERE 
    NOT EXISTS 
    (
     SELECT TOP 1 1 FROM @Test 
     WHERE 
      ID = 'WR52' 
    ) 

UNION ALL 

SELECT 'Hats', 0 
WHERE 
    NOT EXISTS 
    (
     SELECT TOP 1 1 FROM @Test 
     WHERE 
      ID = 'TG32' 
    ) 


UNION ALL 

SELECT 'Coats', 0 
WHERE 
    NOT EXISTS 
    (
     SELECT TOP 1 1 FROM @Test 
     WHERE 
      ID = 'QD65' 
    ) 

UNION ALL 

SELECT 'Shoes', 0 
WHERE 
    NOT EXISTS 
    (
     SELECT TOP 1 1 FROM @Test 
     WHERE 
      ID = 'HT76' 
    ) 
+0

これらのデータが別のテーブルに移動された場合、つまり、もはや存在しなくなった場合、どのように帽子、コート、シューズをカバーするかについてのアイディアは、選択リストを拡張してIDを追加するだけでした( 'Hats'、Coats '、Shoes'シャツ ')しかし、それは動作しません。 – SSMSJ

+0

はい、作品はよりコンパクトな方法を考えようとしていましたが、ちょっと感謝しています! – SSMSJ

1

を試してみてください。

DECLARE @Test TABLE (ID NVARCHAR(10),Number INT) 

INSERT INTO @Test VALUES ('TG32',6) 
INSERT INTO @Test VALUES ('TG32',6) 
INSERT INTO @Test VALUES ('TG32',6) 
INSERT INTO @Test VALUES ('TG32',2) 
INSERT INTO @Test VALUES ('QD65',2) 
INSERT INTO @Test VALUES ('QD65',3) 
INSERT INTO @Test VALUES ('QD65',3) 
INSERT INTO @Test VALUES ('HT76',7) 
INSERT INTO @Test VALUES ('HT76',1) 
INSERT INTO @Test VALUES ('HT76',5) 

DECLARE @Categories TABLE (ID NVARCHAR(10), Item NVARCHAR(10)) 
INSERT INTO @Categories (ID, Item) VALUES 
    ('TG32', 'Hats'), 
    ('QD65', 'Coats'), 
    ('HT76', 'Shoes'), 
    ('WR52', 'Shirts') 

SELECT C.Item, ISNULL(S.Number, 0) AS 'Number' 
FROM @Categories C 
LEFT JOIN @Test S ON C.ID = S.ID 

このようにして、新しいカテゴリを1か所に追加するだけで、どのカテゴリにアイテムがないかを手動でリストする必要はありません。

さらに、各アイテムの合計を取得することもできます。

SELECT C.Item, SUM(ISNULL(S.Number, 0)) AS 'Number' 
FROM @Categories C 
LEFT JOIN @Test S ON C.ID = S.ID 
GROUP BY C.Item 
+0

総計が必要です – SSMSJ

0
SELECT 
    CASE 
    WHEN ID = 'TG32' THEN 'Hats' 
    WHEN ID = 'QD65' THEN 'Coats' 
    WHEN ID = 'HT76' THEN 'Shoes' 
    WHEN ID = 'WR52' THEN 'Shirts' 
    END AS 'Item', 
    Number 
FROM @Test 
UNION ALL 
SELECT 
    'Shirts', 
    0 
+0

このコードスニペットは問題を解決するかもしれませんが[説明を含む](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)は本当に役立ちますあなたの投稿の質を向上させる。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。 – yennsarah

+0

ゼロ値は、クライアントがこの製品/ステージがプロセスの一部であり、その製品の横に何もカウントを蓄積していないことを認識するようにする必要があります。 – SSMSJ

+0

今後質問をするときには、このことに気をつけようとします! – SSMSJ

0

これは、あなたがItem値にId値をマッピングするために別々のルックアップテーブルを使用する必要があります場合は以下のようになります。あなたはそうのようなことを行うことができます。このソリューションは、あらゆる不足している商品の種類ための「ゼロ」の行を生成すること

-- Sample data. 
declare @Test as Table (Id NVarChar(10), Number Int); 
insert into @Test (Id, Number) values 
    ('TG32',6), ('TG32',6), ('TG32',6), ('TG32',2), ('QD65',2), 
    ('QD65',3), ('QD65',3), ('HT76',7), ('HT76',1), ('HT76',5); 
select * from @Test; 

-- Using a CTE with a lookup table. 
with ProductLookup as (
    select ProductCode, Item 
    from (values ('TG32', 'Hats'), ('QD65', 'Coats'), ('HT76', 'Shoes'), ('WR2', 'Shirts')) as 
     Alpha(ProductCode, Item)) 
    select PL1.Item, T.Number 
    from @Test as T inner join 
     ProductLookup as PL1 on PL1.ProductCode = T.Id 
    union all 
    select Item, 0 
    from ProductLookup as PL2 
    where not exists (select 42 from @Test where Id = PL2.ProductCode); 

注:同じ結果が本当に短い寿命でルックアップテーブルを作成するために、共通テーブル式(CTE)を使用していたことができます、シャツだけではありません。

仮定:SQL Server 2005以降を使用しています。適切なソフトウェア(MySQL、Oracle、DB2など)とバージョンの両方でデータベースの質問にタグを付けると便利です。 sql-server-2014

+0

申し訳ありませんが、私はt-sqlとsqlserverというタグを付けていました/私はSQL Server 2014を使用しています – SSMSJ

関連する問題