2016-07-14 55 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 

我想在這說襯衫0的結果得到一個額外的行,而沒有用於ID WR52沒有數據,直到有?

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 IN(「帽子」,大衣,鞋,襯衫'),但不起作用。 – 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 

這種方式,你只需要在一個地方添加一個新的類別,而不必手動列出類別沒有任何項目。

此外,你也許希望得到每個項目的總數。你能做到這一點,像這樣:

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

這看起來像你應該使用一個單獨的查找表Id值映射到Item值的情況。

-- 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

相關問題