2014-05-29 4 views
0

У меня есть запрос, который я хочу предоставить фиксированный вывод таблицы (так что я могу графа в Excel проще). Запрос выглядит следующим образом:Таблица SQL Sum с фиксированными строками?

SELECT 

Case 

WHEN ScrapsReasonID = 2339 THEN 'Box 5' 

WHEN ScrapsReasonID = 2340 THEN 'Box 6' 

WHEN ScrapsReasonID = 2342 THEN 'Box 7' 

WHEN ScrapsReasonID = 2343 THEN 'Box 8' 

WHEN ScrapsReasonID = 2344 THEN 'Box 9' 

Else 'Unknown' 

END 

AS 'BoxNumber', 

count(Case When PartNumberID = '378' Then Scraps End) AS '9.5mm', 

count(Case When PartNumberID = '379' Then Scraps End) AS '10.0mm', 

count(Case When PartNumberID = '380' Then Scraps End) AS '10.5mm' 


FROM [ProcessControl].[dbo].[OutputScrap] 

WHERE 

MachineId = '93' 

And ScrapsReasonID In 

(
'2339', 
'2340', 
'2342', 
'2343', 
'2344' 
) 

And PDate Between '22-may-2014' and '29-may-2014' 

GROUP BY ScrapsReasonID 

Это работает, если есть определенно все 5 scrapreasonIDs между датами набора, но если есть только 3, например, я получаю только 3 строки в таблице Sum. Есть ли способ всегда возвращать все 5 scrapreasonID и нулевые значения для 9.5, 10.0, 10.5, если они не существуют?

+1

рассмотреть вопрос о предоставлении надлежащих DDLS (и/или sqlfiddle) вместе с желаемым результатом SET. – Strawberry

+0

Это sql-сервер, я думаю, вы должны правильно пометить свой вопрос. –

+0

Удален тег mysql и добавлен тег sql-server, потому что синтаксис явно предлагает SQL Server. –

ответ

1

Вы хотите использовать left outer join вместо инструкции case. Кроме того, я делаю следующие изменения:

  • Изменение count() к sum(). Кажется более разумным хотеть суммировать значения в поле, называемом «обрывки», хотя я могу ошибаться.
  • Добавлен Else 0 к условным агрегатам. Я предполагаю, что вы хотите 0, когда нет совпадений, а не NULL.
  • Удалено условие на ScrapsReasonID. join выполняет необходимую фильтрацию.
  • Перемещено оставшиеся условия в положение on, поэтому where не превращает внешнее соединение во внутреннее соединение.
  • Удалены одинарные кавычки для имен столбцов. Для SQL Server используйте квадратные скобки (я принимаю SQL Server из-за соглашения об именовании таблицы из трех частей).
  • Изменен формат даты в формате ISO YYYY-MM-DD.

Вот результирующему запрос

SELECT bn.BoxNumber, 
     SUM(Case When PartNumberID = '378' Then Scraps Else 0 End) AS [9.5mm], 
     SUM(Case When PartNumberID = '379' Then Scraps Else 0 End) AS [10.0mm], 
     SUM(Case When PartNumberID = '380' Then Scraps Else 0 End) AS [10.5mm] 
FROM (SELECT 2339 as ScrapsReasonID, 'Box 5' as BoxNumber UNION ALL 
     SELECT 2340, 'Box 6' UNION ALL 
     SELECT 2342, 'Box 7' UNION ALL 
     SELECT 2343, 'Box 8' UNION ALL 
     SELECT 2344, 'Box 9' 
    ) bn LEFT OUTER JOIN 
    [ProcessControl].[dbo].[OutputScrap] os 
    ON os.ScrapsReasonID = bn.ScrapsReasonID AND 
     os.MachineId = '93' AND 
     os.PDate Between '2014-05-22' and '2014-05-29' 
GROUP BY bn.BoxNumber; 
+0

Спасибо, что было очень близко к работе, я удалил оператор where и поместил критерии в оператор on, чтобы предотвратить дальнейшую фильтрацию, и теперь он работает. ) LEFT JOIN млрд [ProcessControl]. [DBO]. [OutputScrap] ОС ПО os.ScrapsReasonID = bn.ScrapsReasonID И бновить между '2014-05-22' И '2014-05-29' И MachineId = '93' – user3687238

Смежные вопросы