0

従業員の名前とベンダーの経験を含むテーブルがあります。次のデータでテーブルを作成する必要があります

私に与えられたデータは

empname vendor experience
a        1
b        2
c        10
d        11
e        20
f        12
g        21
h        22

このようなデータを表示する SQL クエリを生成したい

vendor_experience(months)   count
0-6                          2
0-12                         5
0-18                         5
more                         8

クエリを手伝ってください。

4

4 に答える 4

5

case ステートメントを使用して、排他的範囲のカウントを取得できます。

select case when [vendor experience] <= 6 then '0-6'
            when [vendor experience] <= 12 then '0-12'
            when [vendor experience] <= 18 then '0-18'
            else 'more'
        end [vendor_experience(months)],
       count (*) [count]
  from experiences
 group by
       case when [vendor experience] <= 6 then '0-6'
            when [vendor experience] <= 12 then '0-12'
            when [vendor experience] <= 18 then '0-18'
            else 'more'
        end

これにより、あなたと同じ結果が得られます(範囲を含む):

; with ranges as 
  (
    select 6 as val, 0 as count_all
    union all
    select 12, 0
    union all
    select 18, 0
    union all
    select 0, 1
  )
select case when ranges.count_all = 1
            then 'more'
            else '0-' + convert (varchar(10), ranges.val) 
        end [vendor_experience(months)],
       sum (case when ranges.count_all = 1 
                   or experiences.[vendor experience] <= ranges.val 
                 then 1 end) [count]
  from experiences
 cross join ranges
 group by ranges.val, ranges.count_all

count_allオープンエンド範囲をマークするために 1 に設定されます。

Sql Fiddle はこちらです。

更新:説明の試み。

閉じ括弧で始まり閉じ括弧で終わる最初の部分はCTEwithと呼ばれます。同じクエリで複数回使用でき、状況によっては更新可能であるため、と呼ばれることもあります。ここでは、範囲のデータを準備するために使用され、適切に名前が付けられています。この名前は、メイン クエリで使用されます。範囲の最大値です。範囲に上限がない場合は 1 です (18 以上、または任意の方法で呼び出します)。データ行は、union allによって結合されます。括弧の間のセクションのみをコピーして貼り付け、実行して結果を確認できます。inline viewrangesValcount_all

クロス結合を使用して、本体がexperiences範囲を持つテーブルを結合します。これにより、 と のすべての行の組み合わせが作成されます。行の場合、4 行になります。experiencesrangesd 11

empname vendor experience val count_all
d       11                  6 0
d       11                 12 0
d       11                 18 0
d       11                  0 1

select リストの最初の case ステートメントは、count_all をチェックすることによってキャプションを生成します。それが 1 の場合は を出力moreし、それ以外の場合は上限値を使用してキャプションを作成します。2 番目の case ステートメントは、sum(1) を使用してカウントされます。集計関数は null を無視し、一致が見つからない場合は else がない場合は null と評価されるため、count_all が true (経験からのこの行がこの範囲でカウントされることを意味する) であるかどうか、vendor experienceまたは上限以下であるかどうかを確認するだけで十分です。現在の範囲の範囲値。上記の例では、11 は最初の範囲ではカウントされませんが、残りはすべてカウントされます。

結果は、val と count_all によってグループ化されます。それがどのように機能するかをよりよく理解するには、group by と sum() を削除して、集計前の数値を調べます。empname で並べると、val は、従業員ごとに異なる val に応じて [count] の値がどのように変化するかを確認するのに役立ちます。

注: 私は現在の英語レベルで最善を尽くしました。1 つ (または 2 つ、または必要な数) が必要な場合は、お気軽にお問い合わせください。

于 2012-09-25T13:07:25.533 に答える
0

もう少し動的に、グループ化のためのテーブルを実装します。

create table #t (name varchar(10),e int)

insert into #t values ('a',0)
insert into #t values ('b',4)
insert into #t values ('c',3)
insert into #t values ('d',13)
insert into #t values ('e',25)
insert into #t values ('f',4)
insert into #t values ('g',19)
insert into #t values ('h',15)
insert into #t values ('i',7)


create table #g (t int, n varchar(10))

insert into #g values (6, '0-6') 
insert into #g values (12, '0-12')
insert into #g values (18, '0-18')
insert into #g values (99999, 'more')

select #g.n
,COUNT(*) 
from #g
inner join #t on #t.e <= #g.t
group by #g.n

たとえば、値99999を試してみることをお勧めします。

于 2012-09-25T13:19:14.100 に答える
0

これを試して:

   INSERT INTO ResultTable ([vendor_experience(months)], count)
    Select *FROM
    (
    (SELECT  '0-6', Count(*) From TableA WHERE [vendor experience] <= 6
    UNION ALL
    SELECT  '0-12', Count(*) From TableA  WHERE [vendor experience] <= 12
    UNION ALL
    SELECT  '0-18', Count(*) From TableA  WHERE [vendor experience] <= 18
     UNION ALL
    SELECT  'more', Count(*) From TableA) as Temp
    ) 

重複カウントが不要な場合は、次を試してください。

select t.[vendor_experience(months)], count(*) as count
from (
  select case  
    when [vendor experience] between 0 and 6 then ' 0-6'
    when [vendor experience] between 7 and 12 then '0-12'
    when [vendor experience] between 13 and 18 then '0-18'
    when [vendor experience] >= 19 then 'more'
    else 'other' end as [vendor_experience(months)]
  from TableA) t
group by t.[vendor_experience(months)]
于 2012-09-25T13:14:22.690 に答える
0

累積値を取得する方法は次のとおりです。

select sum(mon0_6) as mon0_6, sum(mon0_12) as mon0_12, sum(mon0_18) as mon0_18,
       sum(more) as more
from (select e.*,
             (case when [vendor experience] <= 6 then 1 else 0 end) as mon0_6,
             (case when [vendor experience] <= 12 then 1 else 0 end) as mon0_12,
             (case when [vendor experience] <= 18 then 1 else 0 end) as mon0_18,
             1 as more
     ) e

これにより、それらが別々の列に配置されます。その後、 を使用unpivotしてそれらを別々の行に配置できます。

ただし、アプリケーション層で累積合計を計算することを検討してください。私はよく、このようなことを Excel で行います。

SQL Server 2008 で累積合計を計算するには、明示的に、または相関サブクエリを介して、自己結合が必要です。SQL Server 2012 では、累積合計のより単純な構文がサポートされています (over句は引数で順序付けられます)。

于 2012-09-25T13:35:15.997 に答える