2014-02-08 3 views
0

Как просто записать несколько строк в подзапросе?Выбор нескольких жестко закодированных строк с подзапросом

Я знаю, что я мог сделать (How to select several hardcoded SQL rows?):

SELECT x.id, SUM(ISNULL(OtherTable.count_column,0)) 
FROM (SELECT 12 AS id 
    UNION 
SELECT 21 AS id 
    UNION 
SELECT 101 AS id 
/*AND so on */ 
) AS x 
LEFT JOIN OtherTable ON x.id = OtherTable.id 
Group BY x.id 

Есть менее неуклюжий и многословный способ сделать это?

То, что я действительно ищу это:

SELECT id, SUM(ISNULL(count_column,0)) FROM OtherTable 
WHERE id IN (12, 21, 101,/*And So On*/) 
GROUP BY id 

В этом случае она не включает сумму 0 для идентификаторов, которые не существуют. Есть ли способ включить идентификаторы, которые не были найдены?

Я заметил PIVOT для SQL Server, но я не уверен, что это делает его более простым/менее подробным.

Я думаю, я просто спрашиваю, есть ли лучший способ?

ответ

0

Попробуйте что-нибудь подобное, используя master..spt_values стол.

SELECT x.id, SUM(ISNULL(OtherTable.count_column,0)) 
FROM 
(
SELECT DISTINCT number AS id 
FROM master..spt_values 
WHERE number >= 1 and number <= 10 
) AS x 
LEFT JOIN OtherTable ON x.id = OtherTable.id 
Group BY x.id 

ИЛИ

SELECT id, SUM(ISNULL(count_column,0)) 
FROM OtherTable 
WHERE id IN (
       SELECT DISTINCT number AS id 
       FROM master..spt_values 
       WHERE number >= 1 and number <= 10 
      ) 
GROUP BY id 

тестовых данных

DECLARE @OtherTable TABLE(ID INT, count_column INT) 
INSERT INTO @OtherTable VALUES 
(1, 10), (2,20),(3,30),(4,NULL),(5,50) 

Запрос

SELECT x.id, SUM(ISNULL(t.count_column,0)) Total_Sum 
FROM 
(
SELECT DISTINCT number AS id 
FROM master..spt_values 
WHERE number >= 1 and number <= 7 
) AS x 
LEFT JOIN @OtherTable t ON x.id = t.id 
Group BY x.id 

набор результатов

╔════╦═══════════╗ 
║ id ║ Total_Sum ║ 
╠════╬═══════════╣ 
║ 1 ║  10 ║ 
║ 2 ║  20 ║ 
║ 3 ║  30 ║ 
║ 4 ║   0 ║ 
║ 5 ║  50 ║ 
║ 6 ║   0 ║ 
║ 7 ║   0 ║ 
╚════╩═══════════╝ 
+0

Я должен был понятнее, это были просто ID не диапазон. Я отредактирую вопрос. – rileymat

0

Просто объявить временную таблицу, которая хранить ваши идентификаторы у используемых в «В пункте».

DECLARE @temp TABLE(ID INT identity(1,1), yourIDs INT) 
INSERT INTO @temp VALUES 
(10),(20),(300),(400) 

ли право присоединиться к временной таблице, чтобы получить сумму count_column против всех идентификаторов вы хотите

select t.yourIDs, Sum(isnull(ot.count_column,0)) 
    from OtherTable ot 
    right JOIN @temp t on t.yourIDs=ot.id 
    group by t.yourIDs 
Смежные вопросы