GROUP BY не работает при применении кейса в SQL Server - PullRequest
0 голосов
/ 12 ноября 2018

Моя цель здесь - получить repairNo, если значение счетчика равно 1, иначе возвращает значение по умолчанию как ноль или что-то еще. Здесь перед применением case оператор работает нормально, но после использования case не возвращается, как ожидалось. Возвращает каждый элемент в виде одной строки. Нет группы по заявке. Как это решить. Любые предложения приветствуются.

SELECT kunden.kundennr, 
       kunden.firma, 
       kunden.vorname, 
       kunden.nachname, 
       kunden.mobil, 
       kunden.email, 
       kunden.geburtsdatum, 
       kunden.isdatenschutzerklaerung, 
       Count(reparaturen.reparaturnr) AS Counts, 
       CASE 
         WHEN Count(reparaturen.reparaturnr) = 1 THEN Cast( 
         reparaturen.reparaturnr AS NVARCHAR(20)) 
         ELSE 0 
       END                            AS RepairNo 
FROM   kunden 
       LEFT JOIN reparaturen 
              ON reparaturen.kundennr = kunden.kundennr 
       LEFT JOIN personal AS PersonalAngenommen 
              ON reparaturen.personalnr = PersonalAngenommen.personalnr 
       LEFT JOIN lieferanten 
              ON reparaturen.kennnr = lieferanten.lieferantennr 
                 AND reparaturen.kenntyp = 2 
       LEFT JOIN personal 
              ON reparaturen.kennnr = personal.personalnr 
                 AND reparaturen.kenntyp = 1 
WHERE  kunden.geloescht = 0 
       AND ( kunden.firma LIKE '%G%' ) 
GROUP  BY kunden.kundennr, 
          kunden.firma, 
          kunden.vorname, 
          kunden.nachname, 
          kunden.mobil, 
          kunden.email, 
          kunden.geburtsdatum, 
          kunden.isdatenschutzerklaerung, 
          reparaturen.reparaturnr 
ORDER  BY kunden.nachname, 
          kunden.vorname 

Ответы [ 4 ]

0 голосов
/ 12 ноября 2018

Вам также нужно остерегаться при использовании GROUP BY и фильтра, например, где. Когда вы используете GROUP BY, вы должны использовать предложение HAVING. Использование where может вызвать нежелательные аномалии.

0 голосов
/ 12 ноября 2018

Вам нужно будет посчитать ремонтно в другом запросе.Пожалуйста, попробуйте:

;with cte as (

SELECT
Kunden.KundenNr
, Kunden.Firma
, Kunden.Vorname
, Kunden.Nachname
, Kunden.Mobil
, Kunden.EMail
, Kunden.Geburtsdatum
, Kunden.IsDatenschutzerklaerung
,COUNT(Reparaturen.ReparaturNr) as Counts
FROM Kunden
 LEFT JOIN Reparaturen on Reparaturen.KundenNr = Kunden.KundenNr 
 LEFT JOIN Personal AS PersonalAngenommen ON Reparaturen.PersonalNr = PersonalAngenommen.PersonalNr 
 LEFT JOIN Lieferanten ON Reparaturen.KennNr = Lieferanten.LieferantenNr AND Reparaturen.KennTyp = 2
 LEFT JOIN Personal ON Reparaturen.KennNr = Personal.PersonalNr AND Reparaturen.KennTyp = 1
WHERE Kunden.Geloescht = 0
AND (
Kunden.Firma Like '%G%'
)GROUP BY Kunden.KundenNr,Kunden.Firma, Kunden.Vorname
 , Kunden.Nachname 
 , Kunden.Mobil 
 , Kunden.EMail 
 , Kunden.Geburtsdatum 
 , Kunden.IsDatenschutzerklaerung


)
select *, 
       case when Counts = 1 Then cast(r.reparaturnr as nvarchar(20)) else 0 end as RepairNo
from cte
LEFT JOIN reparaturen r
ON r.kundenNr = cte.kundenNr
0 голосов
/ 12 ноября 2018

Вы не можете иметь Reparaturen.ReparaturNr в CASE, потому что вы не GROUP BY это.

(следует из комментария, что правильно говорит вам удалить его из GROUP BY.)

После удаления из GROUP BY, попробуйте ...

   CASE 
     WHEN Count(reparaturen.reparaturnr) = 1 THEN Cast( 
     MAX(reparaturen.reparaturnr) AS NVARCHAR(20)) 
     ELSE 0 
   END                            AS RepairNo

Затем вы используете агрегатную функцию, о которой вам сообщит сообщение об ошибке.

SELECT kunden.kundennr, 
       kunden.firma, 
       kunden.vorname, 
       kunden.nachname, 
       kunden.mobil, 
       kunden.email, 
       kunden.geburtsdatum, 
       kunden.isdatenschutzerklaerung, 
       Count(reparaturen.reparaturnr) AS Counts, 
       CASE 
         WHEN Count(reparaturen.reparaturnr) = 1 THEN Cast( 
         MAX(reparaturen.reparaturnr) AS NVARCHAR(20)) 
         ELSE 0 
       END                            AS RepairNo 
FROM   kunden 
       LEFT JOIN reparaturen 
              ON reparaturen.kundennr = kunden.kundennr 
       LEFT JOIN personal AS PersonalAngenommen 
              ON reparaturen.personalnr = PersonalAngenommen.personalnr 
       LEFT JOIN lieferanten 
              ON reparaturen.kennnr = lieferanten.lieferantennr 
                 AND reparaturen.kenntyp = 2 
       LEFT JOIN personal 
              ON reparaturen.kennnr = personal.personalnr 
                 AND reparaturen.kenntyp = 1 
WHERE  kunden.geloescht = 0 
       AND ( kunden.firma LIKE '%G%' ) 
GROUP  BY kunden.kundennr, 
          kunden.firma, 
          kunden.vorname, 
          kunden.nachname, 
          kunden.mobil, 
          kunden.email, 
          kunden.geburtsdatum, 
          kunden.isdatenschutzerklaerung
ORDER  BY kunden.nachname, 
          kunden.vorname 
0 голосов
/ 12 ноября 2018

слепое предположение, что вам нужно иметь 0 в виде текста, используя одинарные кавычки

case when COUNT(Reparaturen.ReparaturNr) = 1 Then cast(Reparaturen.ReparaturNr as nvarchar(20)) else '0' end as RepairNo
...