2010-09-09 8 views
5

Nếu dữ liệu có định dạng sau:truy vấn sql để tìm tổng của tất cả các hàng và đếm các bản sao

SID TID Tdatetime  QID QTotal 
---------------------------------------- 
100 1 01/12/97 9:00AM 66 110 
100 1 01/12/97 9:00AM 66 110 
100 1 01/12/97 10:00AM 67 110 
100 2 01/19/97 9:00AM 66 . 
100 2 01/19/97 9:00AM 66 110 
100 2 01/19/97 10:00AM 66 110 
100 3 01/26/97 9:00AM 68 120 
100 3 01/26/97 9:00AM 68 120 
110 1 02/03/97 10:00AM 68 110 
110 3 02/12/97 9:00AM 64 115 
110 3 02/12/97 9:00AM 64 115 
120 1 04/05/97 9:00AM 66 105 
120 1 04/05/97 10:00AM 66 105 

Tôi muốn để có thể viết một truy vấn để tính tổng cột QTotal cho tất cả các hàng và tìm số lượng hàng trùng lặp cho cột Tdatetime.

Kết quả sẽ trông giống như sau:

Year Total Count
97 | 1340 | 4
Cột thứ ba trong kết quả không bao gồm số lượng hàng riêng biệt trong bảng. Và đầu ra được nhóm theo năm trong cột TDateTime.

+1

Đối với cơ sở dữ liệu nào? –

+0

Tôi không chắc chắn thông tin cơ sở dữ liệu nào bạn sẽ yêu cầu. – ARK

+0

Anh ấy hỏi DBMS là gì. SQL Server, Oracle, MySql, vv –

Trả lời

0

Các truy vấn sau đây có thể giúp:

SELECT 
    'YEAR ' + CAST(sub.theYear AS VARCHAR(4)), 
    COUNT(sub.C), 
    (SELECT SUM(QTotal) FROM MyTable WHERE YEAR(Tdatetime) = sub.theYear) AS total 
FROM 
    (SELECT 
     YEAR(Tdatetime) AS theYear, 
     COUNT(Tdatetime) AS C 
    FROM MyTable 
    GROUP BY Tdatetime, YEAR(Tdatetime) 
    HAVING COUNT(Tdatetime) >= 2) AS sub 
+0

Truy vấn này dường như không hoạt động đối với tình huống được trình bày ở trên. – ARK

+0

Tôi đã cập nhật mã. – Zafer

+0

Tôi biết đây là một câu hỏi cũ, nhưng đối với bất kỳ ai khác tìm thấy câu hỏi đó: 'ĐANG COUNT (Tdatetime)> 2' có thể là'> 1' hoặc '> = 2' nếu không nó sẽ không tìm thấy bất cứ điều gì tổng số 2 – laurencemadill

0

Bạn phải thực hiện SELECT từ bảng này Phân loại theo QTotal, sử dụng COUNT (bảng chọn từ bảng này WHERE QTotal là giống nhau). Nếu tôi chỉ có thời gian tôi sẽ viết cho bạn câu lệnh SQL, nhưng sẽ mất vài phút.

0

Cái gì như:

select Year(Tdatetime) ,sum(QTotal), count(1) from table group by year(Tdatetime) 

hoặc toàn ngày

select Tdatetime ,sum(QTotal), count(1) from table group by year(Tdatetime) 

Hoặc cú pháp xấu xí của bạn (:))

select 'Year ' + cast(Year(tdatetime) as varchar(4)) 
    + '|' + cast(sum(QTotal) as varchar(31)) 
    + '|' + cast(count(1) as varchar(31)) 
from table group by year(Tdatetime) 

Hoặc bạn có muốn chỉ là năm? Tổng hợp tất cả các cột? Hay chỉ theo năm?

+0

Tổng của cột Qtotal được nhóm theo năm trong cột TDateTime. Đếm cột TDateTime trùng lặp. – ARK

1

này sẽ làm việc nếu bạn thực sự muốn nhóm của cột tDateTime:

SELECT DISTINCT tDateTime, SUM(QTotal), Count(distinct tDateTime) 
FROM Table 
GROUP BY tDateTime 
HAVING Count(distinct tDateTime) > 1 

Nhưng kết quả của bạn trông giống như bạn muốn nhóm của năm trong cột tDateTime. Điều này có đúng không?

Nếu vậy hãy thử này:

SELECT DISTINCT YEAR (tDateTime), SUM(QTotal), Count(distinct tDateTime) 
FROM Table 
GROUP BY YEAR (tDateTime) 
HAVING Count(distinct tDateTime) > 1 
+0

Có, tôi muốn nó được nhóm theo năm trong cột TDateTime. – ARK

+0

Hãy xem bản cập nhật của tôi –

+0

không bao gồm các hàng không có hàng trùng lặp? kết quả của truy vấn chỉ nên hiển thị số trùng lặp, không bao gồm các hàng riêng biệt. – ARK

0
SELECT 
YEar + year(Tdatetime), 
SUM (QTotal), 
(SELECT COUNT(*) FROM ( 
SELECT Tdatetime FROM tDateTime GROUP BY Tdatetime   
HAVING COUNT(QID) > 1) C 
FROM 
Tdatetime t 

GROUP BY 
YEar + year(Tdatetime) 
+0

Tôi nghĩ bạn đã trả lời câu hỏi như đã nêu, nhưng tôi nghĩ câu hỏi thực sự là sai. Như điều này được hiển thị, dữ liệu được trả về là không chuẩn hóa. Nó hiển thị cùng một COUNT cho mỗi hàng, với một giá trị biểu thị toàn bộ dân số thay vì năm của nhóm. Tôi nghĩ rằng truy vấn phụ bên trong cần phải được thay đổi thành truy vấn con tương quan, lọc theo "năm (Tdatetime)". –

0

Đây là lần đầu tiên tôi đã hỏi một câu hỏi về stackoverflow. Có vẻ như tôi đã mất thông tin ID ban đầu của mình. Tôi đã phải đăng ký để đăng nhập và thêm ý kiến ​​cho câu hỏi tôi đã đăng.

Để trả lời câu hỏi của OMG Ponies, đây là cơ sở dữ liệu SQL Server 2008. @Abe Miessler, hàng có SID 120 không chứa bản sao. hàng đầu tiên cho SID 120 hiển thị 9:00 AM trong cột ngày giờ và hàng thứ hai hiển thị 10:00 sáng.

@Zafer, truy vấn của bạn là câu trả lời được chấp nhận. Tôi đã thực hiện một vài chỉnh sửa nhỏ để làm cho nó hoạt động. Cảm ơn. Cảm ơn vì Abe Miessler và những người khác đã giúp bạn.

+0

Bạn cần đánh dấu câu trả lời được chấp nhận là được chấp nhận. – RickF