2014-03-19 27 views
1

目前,我有一個這樣的查詢:擴展SQL結果 - 添加行,如果不存在

SELECT d.[status] 
     ,d.[PGID] as PGID 
     ,pg.[nvarchar5] as PGName 
     ,COUNT(d.[nvarchar10]) 
FROM 
     [content].[dbo].[USRData] d 
INNER JOIN 
     [content].[dbo].[USRData] pg on d.[PGID] = pg.[tp_ID] 
WHERE d.CatId = '12345' 
     AND d.[nvarchar10] is not null 
     AND d.[isActive] = 1 
     AND pg.[CatId] = '64521' 
GROUP BY 
     pg.[nvarchar5] 
    ,d.[status] 
ORDER BY PGName 

這是結果(只是一個虛構的例子):

status PGID PGName Total 
--------- ------- --------- --------- 
active 10  HR  120 
deleted 10  HR  5 
new  10  HR  10 
active 15  IT  10 
new  15  IT  40 
deleted 32  FI  12 
new  32  FI  30 

我需要一個查詢這樣的結果應該是這樣的:

所不同的是:我要爲每一個PG總爲每個可能的狀態的列表,即使它不存在。如果它不存在,我需要一行例如「刪除15 IT 0」 我現在需要每個PG的每一個可能的狀態總數。

我需要改變什麼?

編輯: 更多信息

  1. 在當前查詢的內部聯接是PGID,而不是狀態
  2. 我的表,例如:use array/variable in sql-query

更新2: 與此查詢我得到更好的結果,只有總數不正確...

SELECT stat.status 
     ,d.[PGID] as PGID 
     ,pg.[nvarchar5] as PGName 
     ,COUNT(d.[nvarchar10]) 
FROM 
    (select distinct [status] 
    from [content].[dbo].[USRData] 
    where CatId = '1234') stat cross Join 
     [content].[dbo].[USRData] d INNER JOIN 
     [content].[dbo].[USRData] pg on d.[PGID] = pg.[tp_ID] 
where d.CatId = '1234' 
     AND d.[nvarchar10] is not null 
     AND stat.status is not null 
     AND d.[isActive] = 1 
     AND pg.[CatId] = '64521' 
group by stat.status, 
     pg.[nvarchar5], 
     d.[PGID] 
order by PGName 

若按照這樣我的例子,這是我得到:

status PGID PGName Total 
--------- ------- --------- --------- 
active 10  HR  135 
deleted 10  HR  135 
new  10  HR  135 
active 15  IT  50 
deleted 15  IT  50 
new  15  IT  50 
active 32  FI  42 
deleted 32  FI  42 
new  32  FI  42 

我得到的總的每PGName。我怎樣才能得到每個PGName /狀態的總數?

回答

0

您可以通過創建statusPGID的笛卡爾積來完成此操作。你可以從你正在使用的桌子上得到這個。在這種情況下,我想查詢是:

SELECT sall.[status], pgall.[PGID] as PGID, pg.[nvarchar5] as PGName, COUNT(d.[nvarchar10]) 
FROM (select distinct status from [content].[dbo].[USRData]) sall cross join 
    (select distinct pgid from [content].[dbo].[USRData]) pgall left outer join 
    [content].[dbo].[USRData] d 
    on d.status = sall.status left outer join 
    [content].[dbo].[USRData] pg 
    on pg.[PGID] = pgall.[tp_ID] 
where d.CatId = '12345' AND 
     d.[nvarchar10] is not null AND 
     d.[isActive] = 1 AND 
     pg.[CatId] = '64521' 
group by pgall.[nvarchar5], sall.[status] 
order by PGName 

我不是100%肯定這是你想要的,因爲你是從d表採取PGIDstatus - 我不完全理解自我加入這裏。

+0

這裏是我的表的詳細信息:http://stackoverflow.com/questions/ 22475998/use-array-variable-in-sql-query/22476168?noredirect = 1#comment34189932_22476168 – endeka

+0

我試過這段代碼,但它不工作。你現在瞭解與上面的鏈接自我加入? – endeka

0

內連接的問題,在你的查詢,它排除了沒有誰的用戶角色,而是使用LEFT JOIN

SELECT d.[status] 
    ,d.[PGID] as PGID 
    ,pg.[nvarchar5] as PGName 
    ,COUNT(d.[nvarchar10]) 
FROM [content].[dbo].[USRData] d Left JOIN 
[content].[dbo].[USRData] pg on d.[PGID] = pg.[tp_ID] 
where d.CatId = '12345' 
AND d.[nvarchar10] is not null 
AND d.[isActive] = 1 
AND pg.[CatId] = '64521' 
group by pg.[nvarchar5], d.[status] 
order by PGName 
+0

在當前查詢中,內部連接處於PGID而非狀態。所以這不起作用。 – endeka