SQL Group By / Count: считать одинаковые значения в нескольких столбцах?

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

Пример: скажи, что у меня естьтуЬаЫе

Source data table:

P1  P2  P3
-----------
a   b   a
a   a   a
b   b   b
a   b   b

Я хочу запрос, который считает a и b в каждом столбце, производя что-то вроде:

Desired query output:

     P1  P2  P3
   -------------
a |  3   1   2
b |  1   3   2

Я знаю, что могу сделать это для одного столбца легко сгруппа по:

select P1, count(*) as mycounts
from mytable
group by P1

Но возможно ли это сделать длякаждый столбец?

Я использую SQL Server 2008 (T-SQL). Заранее благодарю за любую помощь!

Ответы на вопрос(2)

Вероятно, не самый эффективный, но это работает.

    ;WITH data
AS
(
    SELECT 'a' AS p1, 'b' AS p2, 'a' AS p3
    UNION ALL
    SELECT 'a', 'a','a'
    UNION ALL
    SELECT 'b','b','b'
    UNION ALL
    SELECT 'a','b','b'
)
SELECT
    p_one.value AS header,
    p1,
    p2,
    p3
FROM (SELECT
          p1 AS value,
          count(*) AS p1
      FROM data d
      GROUP BY p1) p_one
left JOIN (SELECT
            p2 AS value,
            count(*) AS p2
            FROM data d
            GROUP BY p2) p_two
    ON p_two.value = p_one.value
left JOIN (SELECT
            p3 AS value,
            count(*) AS p3
            FROM data d
            GROUP BY p3) p_three
    ON p_two.value = p_three.value
 sam yi08 февр. 2012 г., 05:30
левое соединение здесь тоже не сработает. то есть. если p1 только как "a" s, то "b" s в p2 и p3 будут игнорироваться.
 Philip Kelley08 февр. 2012 г., 01:02
Cte хорошо, но сделайте следующий запрос сводным оператором.
Решение Вопроса

Сначала некоторые тестовые данные:

DECLARE @tbl TABLE(P1 VARCHAR,P2 VARCHAR,P3 VARCHAR)

INSERT INTO @tbl
SELECT 'a','b','a' UNION ALL
SELECT 'a','a','a' UNION ALL
SELECT 'b','b','b' UNION ALL
SELECT 'a','b','b'

Тогда стержень, как это:

SELECT
    *
FROM
(
    SELECT 'P1' AS P, P1 AS PValue,P1 AS test FROM @tbl
    UNION ALL
    SELECT 'P2',P2,P2 FROM @tbl
    UNION ALL
    SELECT 'P3',P3,P3 FROM @tbl
) AS p
PIVOT
(
    COUNT(PValue)
    FOR P IN ([P1],[P2],[P3])
) AS pvt

Вот больше информации о Pivot и Unpivot

 Dave Guarino08 февр. 2012 г., 16:07
Спасибо, Арион! Это прекрасно! Теперь изучите синтаксис и изучите кишки этих функций: D
 Arion08 февр. 2012 г., 16:12
Тогда вы можете принять ответ. Рад помочь :) .. Я добавил подобное в ответ на страницу MSDN для пивотов.
 Dave Guarino08 февр. 2012 г., 16:26
И теперь я научился принимать ответ. Ох, интернет-педагогика, как я тебя обожаю.

Ваш ответ на вопрос