2010-01-26 5 views
1
SELECT 
DT, FlowParam, Abs_P, T, Volume, Energy, FlowTime_T, 
    (SELECT ' > 1 ' AS Expr1 WHERE (
     (SELECT COUNT(*) AS Expr2 
      FROM dbo.BACS_Alarm_1 
      WHERE 
      (DT_T >= dbo.BACS_HourFlow_1.DT_T) AND 
      (DT_T <= dbo.BACS_HourFlow_1.DT_T + dbo.BACS_HourFlow_1.FlowTime_T) 
     ) > 1 
    )) AS Something 
FROM dbo.BACS_HourFlow_1 

je besoin champ de sortie AS Something de BACS_Alarm_1 table si WHERE... = 1 et sortie Null si = 0 ... et la sortie de mon message si> 1 (ce qui est déjà fait)SQL [CAS Interrogation Voir]

Comment Je réalise ce cas?

Alors si

(SELECT COUNT(*) AS Expr2 
    FROM dbo.BACS_Alarm_1 
    WHERE 
    (DT_T >= dbo.BACS_HourFlow_1.DT_T) AND 
    (DT_T <= dbo.BACS_HourFlow_1.DT_T + dbo.BACS_HourFlow_1.FlowTime_T) 
) > 1 

I sortie '> 1' comme quelque chose

si = 1 Je sortie un champ de dbo.BACS_Alarm_1 si = 0 I Sortie 0 ou null

+0

donc, fondamentalement, si 0, vous voulez qu'il soit 'null', si elle est 1 le résultat de la sous-requête (sortie à la colonne' Something'), il est sortie comme autre chose, et si elle est supérieure à 1, c'est un message personnalisé? – Anthony

+0

Est-ce MySQL ou autre chose? – Anthony

+0

Quelle base de données? Vous devriez probablement essayer d'utiliser une jointure au lieu d'une sous-requête corrélée. –

Répondre

3

Laissant le plus comme est, vous pouvez écrire:

SELECT 
DT, FlowParam, Abs_P, T, Volume, Energy, FlowTime_T, 
    CASE (
     SELECT COUNT(*) AS Expr2 
     FROM dbo.BACS_Alarm_1 
     WHERE (DT_T >= dbo.BACS_HourFlow_1.DT_T) 
     AND (DT_T <= dbo.BACS_HourFlow_1.DT_T + dbo.BACS_HourFlow_1.FlowTime_T) 
    ) WHEN 0 THEN NULL 
     WHEN 1 THEN ' > 1 ' 
     ELSE 'something else' 
    END AS Something 
FROM dbo.BACS_HourFlow_1 

Pourtant, je pense qu'il peut être amélioré un peu ... Je ne pense pas que la sous-requête est nécessaire. Puisque vous avez mentionné les valeurs 1 et 0 résultats que possible, je pense que vous pouvez omettre COUNT trop:

SELECT DT 
,  FlowParam 
,  Abs_P 
,  T 
,  Volume 
,  Energy 
,  FlowTime_T 
,  CASE 
      WHEN dbo.BACS_Alarm_1.DT_T IS NULL THEN NULL 
      ELSE ' > 1' 
     END AS Something 
FROM  dbo.BACS_HourFlow_1 
LEFT JOIN dbo.BACS_Alarm_1 
ON   dbo.BACS_HourFlow_1.DT_T <= dbo.BACS_Alarm_1.DT_T 
AND   dbo.BACS_HourFlow_1.DT_T + dbo.BACS_HourFlow_1.FlowTime_T >=   dbo.BACS_Alarm_1DT_T 

Si posible sont vraiment plus de résultats, et le COUNT dans l'original pourrait donner plus de 1, vous pouvez l'écrire comme ceci:

SELECT DT 
,  FlowParam 
,  Abs_P 
,  T 
,  Volume 
,  Energy 
,  FlowTime_T 
,  CASE COUNT(*) 
      WHEN 0 THEN NULL 
      WHEN 1 THEN ' > 1' 
      ELSE 'something else' 
     END AS Something 
FROM  dbo.BACS_HourFlow_1 
LEFT JOIN dbo.BACS_Alarm_1 
ON   dbo.BACS_HourFlow_1.DT_T <= dbo.BACS_Alarm_1.DT_T 
AND   dbo.BACS_HourFlow_1.DT_T + dbo.BACS_HourFlow_1.FlowTime_T >= dbo.BACS_Alarm_1DT_T 
GROUP BY BACS_HourFlow_1.DT 
,   BACS_HourFlow_1.FlowParam 
,   BACS_HourFlow_1.Abs_P 
,   BACS_HourFlow_1.T 
,   BACS_HourFlow_1.Volume 
,   BACS_HourFlow_1.Energy 
,   BACS_HourFlow_1.FlowTime_T 
+0

merci mais qu'en est-il de UNION? – Cynede

+1

Eh bien, ce serait une autre possibilité, oui. Mais je suis presque sûr à 100% que la solution serait plus verbeuse et moins performante. –

+0

bon à savoir ... merci de votre compréhension à nouveau :) – Cynede