2011-02-03 28 views
2

我有一張列出訪問診所的表。我希望得到一種「直方圖」,顯示患者與總數一起訪問診所的頻率。下面是一些示例代碼(在MS SQL Server 2005的測試)來展示一下我說的:如何從具有計算字段的SQL查詢中獲得總數

CREATE TABLE #test (
    visit_id int IDENTITY(1,1), 
    patient_id int 
); 

DECLARE @num_patients int; 
SELECT @num_patients = 1000 + ABS(CHECKSUM(NEWID())) % 250; 

INSERT INTO #test (patient_id) 
SELECT TOP 15 PERCENT ABS(CHECKSUM(NEWID())) % @num_patients 
FROM sysobjects a, sysobjects b; 

-- SELECT COUNT(*) AS total_visits FROM #test; 

-- SELECT COUNT(DISTINCT patient_id) AS distinct_patients FROM #test; 

SELECT CASE GROUPING(num_pat_visits) WHEN 1 THEN 'Total' 
      ELSE CAST(num_pat_visits AS varchar(5)) END AS num_pat_visits, 
    COUNT(*) AS num_patients, num_pat_visits * COUNT(*) AS tot_pat_visit 
FROM 
    (SELECT patient_id, COUNT(*) AS num_pat_visits FROM #test GROUP BY patient_id) a 
GROUP BY num_pat_visits WITH ROLLUP 
ORDER BY CAST(num_pat_visits AS int) DESC; 

這讓我幾乎到了我想在那裏:

num_pat_visits num_patients tot_pat_visit 
-------------- ------------ ------------- 
60      1   60 
54      2   108 
52      2   104 
51      4   204 
50      3   150 
49      3   147 
48      7   336 
47      7   329 
46      15   690 
45      15   675 
44      29   1276 
43      36   1548 
42      45   1890 
41      45   1845 
40      59   2360 
39      71   2769 
38      51   1938 
37      72   2664 
36      77   2772 
35      74   2590 
34      72   2448 
33      82   2706 
32      90   2880 
31      74   2294 
30      69   2070 
29      47   1363 
28      30   840 
27      27   729 
26      26   676 
25      21   525 
24      13   312 
23      4   92 
22      5   110 
21      4   84 
20      2   40 
18      2   36 
Total     1186   NULL 

但是,我不能似乎讓SQL Server顯示在總行上表示NULL的訪問總數。

任何想法?

+0

很好的例子代碼! – 2011-02-03 22:27:12

回答

2

我認爲你可以這樣做:

sum(num_pat_visits) as tot_pat_visit

SELECT CASE GROUPING(num_pat_visits) WHEN 1 THEN 'Total' 
      ELSE CAST(num_pat_visits AS varchar(5)) END AS num_pat_visits, 
    COUNT(*) AS num_patients, 
    --num_pat_visits * COUNT(*) AS tot_pat_visit 
    sum(num_pat_visits) as tot_pat_visit 
FROM 
    (SELECT patient_id, COUNT(*) AS num_pat_visits FROM #test GROUP BY patient_id) a 
GROUP BY num_pat_visits WITH ROLLUP 
ORDER BY CAST(num_pat_visits AS int) DESC; 
+0

獲取我需要的地方,謝謝! – Joe 2011-02-04 14:04:20