4

これが私のコードです

SELECT
  CASE
       WHEN Money >= 20000 THEN '$ 20,000 + '
       WHEN Money BETWEEN 10000 AND 19999 THEN '$ 10,000 - $ 19,999'
       WHEN Money BETWEEN  5000 AND  9999 THEN '$  5,000 - $  9,999'
       WHEN Money BETWEEN     1 AND  4999 THEN '$      1 - $  4,999'
       ELSE '$      0'
   END AS [MONEY],
       COUNT(*) AS [#],
       MAX(Money) AS [MAX]
  FROM MyTable
 WHERE MoneyType = 'Type A'
 GROUP BY 
  CASE
       WHEN Money >= 20000 THEN '$ 20,000 + '
       WHEN Money BETWEEN 10000 AND 19999 THEN '$ 10,000 - $ 19,999'
       WHEN Money BETWEEN  5000 AND  9999 THEN '$  5,000 - $  9,999'
       WHEN Money BETWEEN     1 AND  4999 THEN '$      1 - $  4,999'
       ELSE '$      0'
   END
 ORDER BY MAX DESC 

今、私の問題は、すべてのケースで結果セットに行を表示することですが、1 と 4999 の間の値がないため、その行は表示されません。私はまだその行が表示され、その列に0だけが含まれていることを望みます(もちろん最初のものを除く)。これを達成するためにコードを変更する方法を誰でも教えてもらえますか? おそらく私はそれを別の方法で行う必要があります...ありがとう!

探している結果セットの例...

  |  [MONEY]              |   [#]   |    [MAX]    |
  |  $ 20,000+            |   2     |    30,000   |
  |  $ 10,000 - $ 19,999  |   8     |    19,000   |
  |  $  5,000 - $  9,999  |   4     |     8,000   |
  |  $      1 - $  4,999  |   0     |     0       |     <-- Row currently doesn't show
  |  $      0             |   12    |     0       |
4

4 に答える 4

4

CTEを使用してルックアップテーブルを作成し、Caseステートメントの代わりにそれを使用してグループ化することができます。他に3つの変更を加える必要があります

  • COUNTはCOUNT(t.Money)である必要があります。そうでない場合、ゼロを期待しているときに1を取得します。
  • MAX(Money)を合体させたいと思うかもしれませんが、NULLの場合にどのようにしたいかわかりません
  • MAX(MONEY)はnullの可能性があるため、実際に注文することはできません。したがって、CTEを使用して順序も制御することをお勧めします


WITH Ranges AS
( SELECT 1 id , '$ 20,000 +'  description
  UNION SELECT 2 , '$ 10,000 - $19,999'
  UNION SELECT 3, '$  5,000 - $ 9,999'
  UNION SELECT 4, '$      1 - $ 4,999'
  UNION SELECT 5, '$      0')


SELECT
       r.Description as money,
       COUNT(t.Money) AS [#],
       MAX(Money) AS [MAX]
  FROM 
       Ranges r
       LEFT JOIN
        MyTable t
       ON r.ID =   CASE
                    WHEN Money >= 20000 THEN 1
                    WHEN Money BETWEEN 10000 AND 19999 THEN 2
                    WHEN Money BETWEEN  5000 AND  9999 THEN 3
                    WHEN Money BETWEEN     1 AND  4999 THEN 4
                    ELSE 5
                 END 
        AND  MoneyType = 'Type A' 
 GROUP BY 
  r.id,
  r.Description
 ORDER BY r.id asc

ライブデモ

于 2012-05-17T15:21:05.700 に答える
3

説明テキストを実際のテーブルまたは一時的なテーブルに保存し、それに応じて結合することができます。

;with ranges(min,max,caption) as (
    select 10000, 19999, '$ 10,000 - $19,999' union
    select 5000, 9999,   '$  5,000 - $ 9,999' union
    select 1, 4999,      '$      1 - $ 4,999'
)
select
    isnull(r.caption, 'no description'),
    count(m.money) as [#],
    isnull(max(m.money), 0)
from
    mytable m
full outer join 
    ranges r on m.money between r.min and r.max
group by
    r.caption
于 2012-05-17T15:22:24.490 に答える
2

値を追加してから、追加のグループを挿入できます (テストする SSMS へのアクセスはありません)。

SELECT [MONEY], SUM([#]) AS [#], MAX([MAX]) AS [MAX] FROM
(SELECT
  CASE
       WHEN Money >= 20000 THEN '$ 20,000 + '
       WHEN Money BETWEEN 10000 AND 19999 THEN '$ 10,000 - $19,999'
       WHEN Money BETWEEN  5000 AND  9999 THEN '$  5,000 - $ 9,999'
       WHEN Money BETWEEN     1 AND  4999 THEN '$      1 - $ 4,999'
       ELSE '$      0'
   END AS [MONEY],
       COUNT(*) AS [#],
       MAX(Money) AS [MAX]
  FROM MyTable
 WHERE MoneyType = 'Type A'
 GROUP BY 
  CASE
       WHEN Money >= 20000 THEN '$ 20,000 + '
       WHEN Money BETWEEN 10000 AND 19999 THEN '$ 10,000 - $19,999'
       WHEN Money BETWEEN  5000 AND  9999 THEN '$  5,000 - $ 9,999'
       WHEN Money BETWEEN     1 AND  4999 THEN '$      1 - $ 4,999'
       ELSE '$      0'
   END
 UNION ALL
 SELECT '$      0' AS [MONEY], 0 AS [#], 0 AS [MAX]
 UNION ALL
 SELECT '$      1 - $ 4,999' AS [MONEY], 0 AS [#], 0 AS [MAX]
 UNION ALL
 SELECT '$  5,000 - $ 9,999' AS [MONEY], 0 AS [#], 0 AS [MAX]
 UNION ALL
 SELECT '$ 10,000 - $19,999' AS [MONEY], 0 AS [#], 0 AS [MAX]
 UNION ALL
 SELECT '$ 20,000 + ' AS [MONEY], 0 AS [#], 0 AS [MAX]
 ) SUB
GROUP BY [MONEY]
于 2012-05-17T15:14:58.113 に答える
1

うーん...私がすること:

表tからの代わりに

サブクエリから選択します

From 
(
 Select Money, 1 as ForReal from Table t
 Union
 Select 1, 0
 Union
 Select 5000, 0
 Union 
 Select 10000, 0
 Union
 Select 20001, 0
)

そして、私の一番の選択はMax(Money * ForReal)なので、グループ化を取得し、MaxAmountとして0を取得します。

于 2012-05-17T15:21:05.013 に答える