2016-05-02 34 views
0

この選択では、私は合計結果がIIFの式が必要ですが、私はこのクエリを実行すると、最初のIIFステートメントだけを取得します。なにか提案を??おかげSUMのIIF式の結果

SELECT conto, desconto, date, codoperaio, SUM(IIF(totcasse ='1',SUM(totcasse),0)+ 
               IIF(totcasse ='6',SUM(totcasse*3),0)+ 
               IIF(totcasse ='8',SUM(totcasse*4),0)+ 
               IIF(totcasse ='10',SUM(totcasse*5),0)) as Kilogrammi 
FROM dbo.Import 
where totcasse BETWEEN 1 and 10 
Group by conto, desconto, date,codoperaio, totcasse 
+0

GROUP BY句からtotcasseを削除しますか? – jarlh

答えて

0

間違っていないよあなたがこの

SELECT conto, 
     desconto, 
     date, 
     codoperaio, 
     Sum(CASE totcasse WHEN '1' THEN totcasse ELSE 0 END) + 
     Sum(CASE totcasse WHEN '6' THEN totcasse * 3 ELSE 0 END) + 
     Sum(CASE totcasse WHEN '8' THEN totcasse * 4 ELSE 0 END) + 
     Sum(CASE totcasse WHEN '10' THEN totcasse * 5 ELSE 0 END) 
FROM dbo.Import 
WHERE totcasse in (1,6,8,10) 
GROUP BY conto, 
      desconto, 
      date, 
      codoperaio 

または

SELECT conto, 
     desconto, 
     date, 
     codoperaio, 
     Sum(CASE totcasse 
      WHEN '1' THEN totcasse 
      WHEN '6' THEN totcasse * 3 
      WHEN '8' THEN totcasse * 4 
      WHEN '10' THEN totcasse * 5 
      END) 
FROM dbo.Import 
WHERE totcasse in (1,6,8,10) 
GROUP BY conto, 
      desconto, 
      date, 
      codoperaio 
+0

奇妙なケース関数の使用。私は 合計( 1その後、totcasse 6その後、totcasse * 3 8その後、totcasse * 4 10その後、totcasse * 5 他0 終わりtotcasseケース)、最初はそれが私の答えだった@PSVSupporter – PSVSupporter

+0

に変更しますしかし、これはもっと読めるように見えた –

+0

あなたのソリューションは完璧です。 –

0
SELECT conto, desconto, date, codoperaio, IIF(totcasse ='1',SUM(totcasse),0)+ 
               IIF(totcasse ='6',SUM(totcasse*3),0)+ 
               IIF(totcasse ='8',SUM(totcasse*4),0)+ 
               IIF(totcasse ='10',SUM(totcasse*5),0) as Kilogrammi 
FROM dbo.Import 
where totcasse BETWEEN 1 and 10 
Group by conto, desconto, date,codoperaio, totcasse 
+0

同じクエリのようですね。 – PSVSupporter

+1

@PSVSupporter彼は 'Kilogrammi'の' SUM'を削除しましたが、答えは – Arulkumar

+0

yupだと説明していません。私はすべてSUMの+記号のみを削除します。したがって、合計の必要はありません – Adesh

0

を探している場合はtotcasseでないグループを実行してください。 そして、IIFの後にSUMを使用しないでください。私は、古いSQL Serverのバージョンを持っているので、私はIIFをテストすることはできませんが、私はそれがこのようにすべきだと思います。

SELECT conto, 
     desconto, 
     date, 
     codoperaio, 
     Sum(iif(totcasse = 1, totcasse, 
      iif(totcasse = 6, totcasse * 3, 
      iif(totcasse = 8, totcasse * 4, 
      iif(totcasse = 10, totcasse * 5, 0))))) as Kilogrammi 
FROM dbo.Import 
WHERE totcasse >= 1 
    AND totcasse <= 10 
GROUP BY conto, 
      desconto, 
      date, 
      codoperaio 

、例えば、3または9 totcasseの可能な値が存在しないことを確認してください。そうでなければ計算されません。そうでなければ、0をtotcasseに置き換えます。

0

は、クエリで3つの明白な問題を抱えている、CASE文を使用して

SELECT conto, desconto, date, codoperaio, 
     SUM(CASE totcasse 
      WHEN '1' THEN totcasse 
      WHEN '6' THEN totcasse*3 
      WHEN '8' THEN totcasse*4 
      WHEN '10' THEN totcasse*5 
      ELSE 0 END 
     )as Kilogrammi 
FROM dbo.Import 
where totcasse BETWEEN 1 and 10 
Group by conto, desconto, date,codoperaio, totcasse 
0

これを試してみてください。

  1. SUM()機能をネストすることはできません。
  2. group bytotcasseがありますが、これらを1つの行にまとめたいと思うようです。
  3. WHERE句は、totcasseを文字列ではなく数値として扱います。

iif()ではなく、caseがクエリを書き込むより良い方法です。 (caseは、ANSI標準のSQLで、iif()はMS Accessに後方互換性のためにSQL Serverであり、誰が後方になりたい?)

私は、これはあなたが望むクエリクエリであることを推測しています:

SELECT conto, desconto, date, codoperaio, 
     SUM(CASE WHEN totcasse ='1' THEN totcasse 
       WHEN totcasse ='6' THEN totcasse * 3 
       WHEN totcasse ='8' THEN totcasse * 4 
       WHEN totcasse ='10' THEN totcasse * 5 
       ELSE 0 
      END) as Kilogrammi 
FROM dbo.Import 
where totcasse IN ('1', '2', '3', '4', '5', '6', '7', '8', '9', '10') 
Group by conto, desconto, date, codoperaio; 

WHERE句。あなたは文字列を使用している場合は、その式:

where totcasse between '1' and '10' 

は基本的にのみ'10'で始まる値を返すために起こっています。比較で型を混同しないでください。

+0

IIFはCASEの簡略化された構文としてSQL Server 2012に導入されました。 SQL Serverは内部的にIIF構文をCASEに変換します。しかし、これはパフォーマンスには影響しません。 CASEは「より良い」ものではなく、むしろ好みです。 – PSVSupporter

+1

@PSVSupporter - 彼はパフォーマンスについて話していません –

0
SELECT conto 
, desconto 
, date 
, codoperaio 
, SUM(CASE totcasse 
     WHEN 1 THEN totcasse 
     WHEN 6 THEN totcasse*3 
     WHEN 8 THEN totcasse*4 
     WHEN 10 THEN totcasse*5 
     ELSE 0 
     END) AS Kilogrammi 
FROM dbo.Import 
where totcasse BETWEEN 1 and 10 
Group by conto, desconto, date,codoperaio 
関連する問題