2010-08-19 3 views
0

Таблица: Клиентвопрос о группе пункта в сервере Sql

Name Type Amount 

James P 125.00 
James P 125.00 
James P 125.00 
James R 225.00 
James R 225.00 
Rajiv R 155.00 
Rajiv R 155.00 
Rajiv R 155.00 
Rajiv P 150.00 
Rajiv P 150.00 
Saran R 175.00 

В этой таблице структуру Я хочу выход, который даст количество каждому человеку Р, граф R, сумма Суммы где типа = P, Сумма суммы, в которой тип = R

Любые подсказки для меня, застрявшие в группе, не помогли мне в этом сценарии.

ответ

3

Если вы хотите результат в виде отдельных записей, вы просто группа по имени и типу:

select Name, Type, count(*) as Cnt, sum(Amount) as AmountSum 
from Customer 
Group by Name, Type 
order by Name, Type 

Результат:

Name Type Cnt AmountSum 
James P  3 375.00 
James R  2 450.00 
Rajiv P  2 300.00 
Rajiv R  3 465.00 
Saran R  1 175.00 

Если вы хотите, количество и сумма для лица в та же запись, вы должны сделать некоторые сравнения:

select 
    Name, 
    count(case Type when 'P' then 1 else null end) as CntP, 
    sum(case Type when 'P' then Amount else 0 end) as AmountSumP, 
    count(case Type when 'R' then 1 else null end) as CntR, 
    sum(case Type when 'R' then Amount else 0 end) as AmountSumR, 
from Customer 
Group by Name 
order by Name 

Результат:

Name CntP AmountSumP CntR AmountSumR 
James 3  375.00  2  450.00 
Rajiv 2  300.00  3  465.00 
Saran 0  0.00  1  175.00 
+0

+1 для показа обоих. Существует третий способ ... использовать первый подход, затем использовать ROLLUP. – TomTom

0

один запрос, не КТР, никаких производных таблиц:

SELECT 
    Name, 
    SUM(CASE WHEN Type = 'P' THEN 1 ELSE 0 END) AS PCount, 
    SUM(CASE WHEN Type = 'R' THEN 1 ELSE 0 END) AS RCount, 
    SUM(CASE WHEN Type = 'P' THEN Amount ELSE 0 END) AS PAmount, 
    SUM(CASE WHEN Type = 'R' THEN Amount ELSE 0 END) AS RAmount 
FROM yourTable 
GROUP BY Name 

используя

CREATE TABLE customer (name varchar(50), type char(1), amount decimal(6,2)); 

INSERT INTO customer VALUES ('James', 'P', 125.00); 
INSERT INTO customer VALUES ('James', 'P', 125.00); 
INSERT INTO customer VALUES ('James', 'P', 125.00); 
INSERT INTO customer VALUES ('James', 'R', 225.00); 
INSERT INTO customer VALUES ('James', 'R', 225.00); 
INSERT INTO customer VALUES ('Rajiv', 'R', 155.00); 
INSERT INTO customer VALUES ('Rajiv', 'R', 155.00); 
INSERT INTO customer VALUES ('Rajiv', 'R', 155.00); 
INSERT INTO customer VALUES ('Rajiv', 'P', 150.00); 
INSERT INTO customer VALUES ('Rajiv', 'P', 150.00); 
INSERT INTO customer VALUES ('Saran', 'R', 175.00); 
SELECT 
    Name, 
    SUM(CASE WHEN Type = 'P' THEN 1 ELSE 0 END) AS PCount, 
    SUM(CASE WHEN Type = 'R' THEN 1 ELSE 0 END) AS RCount, 
    SUM(CASE WHEN Type = 'P' THEN Amount ELSE 0 END) AS PAmount, 
    SUM(CASE WHEN Type = 'R' THEN Amount ELSE 0 END) AS RAmount 
FROM customer 
GROUP BY Name 

James 3 2 375.00 450.00 
Rajiv 2 3 300.00 465.00 
Saran 0 1 0.00 175.00 
+0

Pcount и Rcount указаны неверно. – Kashif

+0

@Muhammad Kashif Nadeem: У меня те же значения, что и guffa ... см. Мой комментарий, почему ваш ответ неверен – gbn

+0

спасибо, что освободил это для меня. – Kashif

0

Отредактировано Ответ: После того, как ГБН указал на ошибку в моем оригинальный ответ

SELECT name, 
     SUM(CASE WHEN [type] = 'P' THEN 1 ELSE 0 END) CountOfP , 
     SUM(CASE WHEN [type] = 'R' THEN 1 ELSE 0 END) CountOfR, 
     SUM(CASE WHEN [type] = 'P' THEN Amount End) SumOfP , 
     SUM(CASE WHEN [type] = 'R' THEN Amount END) SumOfR 

FROM customer 
GROUP BY name 

Оригинал ответа

SELECT name, 
     COUNT(CASE WHEN [type] = 'P' THEN 1 ELSE 0 END) CountOfP , 
     COUNT(CASE WHEN [type] = 'R' THEN 1 ELSE 0 END) CountOfR, 
     SUM(CASE WHEN [type] = 'P' THEN Amount End) SumOfP , 
     SUM(CASE WHEN [type] = 'R' THEN Amount END) SumOfR 

FROM customer 
GROUP BY name 
+0

Я немного опаздываю, но рад, что мой ответ несколько похож на гуру, как gbn и Guffa. – Kashif

+0

это неправильно. COUNT (0) совпадает с COUNT (1), потому что вы считаете ненулевые выражения, поэтому всегда будете считать все типы. См. Мой ответ здесь http://stackoverflow.com/questions/1221559/count-vs-count1/1221649#1221649 – gbn

+0

Большое спасибо @gbn. Я очень ценю это. Отредактировал мой ответ. – Kashif