Данная таблица вроде:
+---------+------+--------+-----------+--------------+
| Empcode | name | desig | joinmonth | releivemonth |
+---------+------+--------+-----------+--------------+
| 1. | A1. | D1. | Jan-18. | null |
| 2. | A2. | D2. | Jan-18. | May-18 |
| 3. | A3. | D3. | Jan-18. | null |
+---------+------+--------+-----------+--------------+
Я хочу показать такую таблицу:
+---------------+--------+--------+--------+--------+--------+
| Remarks | jan-18 | feb-18 | mar-18 | apr-18 | may-18 |
+---------------+--------+--------+--------+--------+--------+
| Joinmonth | 3 | 0 | 0 | 0 | 0 |
| Releivedmonth | 0 | 0 | 0 | 0 | 1 |
+---------------+--------+--------+--------+--------+--------+
Посмотрите на PIVOT
или UNPIVOT
.
Ядро СУБД Mssql
Я пробовал в повороте, но не понимаю
ВАЖНО указать, какую базу данных, потому что каждый поставщик базы данных использует свой синтаксис (nb: версия также важна).
База данных Microsoft sql 2012
Не могли бы вы дать мне ответ в ближайшее время
Выберите empname в качестве примечаний, (1-1-18), (1-2-18), (1-3-18), (1-4-18), (1-5-18) From (выберите empname, joimonth , reivedmonth from emply) как s Pivot (count (reivedmonth) для месяца соединения в ((1-1-18), (1-2-18), (1-3-18), (1-4-18), ( 1-5-18)) стержень
пожалуйста, отредактируйте и обновите свой вопрос запросом, который вы пробовали
This is an extended comment rather than answer, please accept that I needed formatting controls before down-voting this.
Похоже, вы добавили запрос в комментарий, хотя синтаксис не был полностью правильным. Вы часто использовали стандартные круглые скобки ()
вместо скобок []
, и отсутствовала закрывающая скобка для завершения IN()
. Я считаю, что ваш запрос должен выглядеть так:
SELECT
empname AS remarks
, [1-1-18]
, [1-2-18]
, [1-3-18]
, [1-4-18]
, [1-5-18]
FROM (
SELECT
empname
, joimonth
, releivedmonth
FROM emply
) AS s
PIVOT (
COUNT(releivedmonth)
FOR joinmonth IN ([1-1-18], [1-2-18], [1-3-18], [1-4-18], [1-5-18])
) piv
Вы не должны пытаться добавлять запросы к комментариям, вместо этого просто отредактируйте вопрос.
В этом запросе вы ссылаетесь на значения, которые выглядят как 1-1-18, но в выборке данных нет ничего похожего на это. К какому типу данных относятся столбцы [joinmonth] и [relivedmonth]?
С данными в виде текста в этих столбцах возникает серьезная проблема. Если, например, все они разные: Jan-18.
, Jan 18
, Jan-18
, то они не будут выравниваться так, как вам нужно. Подобные вариации данных сделают это невозможным.
CREATE TABLE emply(
Empcode NUMERIC(9,0)
,empname VARCHAR(6)
,desig VARCHAR(8)
,joinmonth varchar(30)
,releivemonth varchar(30)
);
INSERT INTO emply(Empcode,empname,desig,joinmonth,releivemonth) VALUES (1.,'A1.','D1.','Jan-18.',NULL);
INSERT INTO emply(Empcode,empname,desig,joinmonth,releivemonth) VALUES (2.,'A2.','D2.','Jan-18.','May 18');
INSERT INTO emply(Empcode,empname,desig,joinmonth,releivemonth) VALUES (3.,'A3.','D3.','Jan-18.',NULL);
SELECT
empname AS remarks
, [Jan-18.]
, [Feb-18.]
, [Mar-18.]
, [Apr-18.]
, [May-18.]
FROM (
SELECT
empname
, joinmonth
, releivemonth
FROM emply
) AS s
PIVOT (
COUNT(releivemonth)
FOR joinmonth IN ([Jan-18.], [Feb-18.], [Mar-18.], [Apr-18.], [May-18.])
) piv
Однако вывод из этого:
+----+---------+---------+---------+---------+---------+---------+
| | remarks | Jan-18. | Feb-18. | Mar-18. | Apr-18. | May-18. |
+----+---------+---------+---------+---------+---------+---------+
| 1 | A1. | 0 | 0 | 0 | 0 | 0 |
| 2 | A2. | 1 | 0 | 0 | 0 | 0 |
| 3 | A3. | 0 | 0 | 0 | 0 | 0 |
+----+---------+---------+---------+---------+---------+---------+
Есть только одно ненулевое значение COUNT(releivemonth)
Оба столбца - varchar
это очень жаль .... если бы они были date или datetime, тогда вы могли бы контролировать формат вывода, но с текстом вам снится кошмар.
Вам нужно развернуть, а затем снова развернуть:
select remarks,
sum(case when mon = 'jan-18' then 1 else 0 end) as jan_18,
sum(case when mon = 'feb-18' then 1 else 0 end) as feb_18,
sum(case when mon = 'mar-18' then 1 else 0 end) as mar_18,
sum(case when mon = 'apr-18' then 1 else 0 end) as apr_18,
sum(case when mon = 'may-18' then 1 else 0 end) as may_18
from t cross apply
(values ('Joinmonth', t.Joinmonth), ('Receivedmonth', Receivedmonth)
) v(remarks, mon)
group by remarks
lol "Вам нужно развернуть, а затем снова развернуть:" То, что вы говорите, правда, но вы сделали и то, и другое без использования функций unpivot или pivot.
@Used_By_Already. . . Я считаю эти «функции» избыточными и слабыми как функции. Боковые соединения и условное агрегирование намного более гибкие.
@Gordon_Linoff Абсолютно согласен, особенно pivot.
какие у вас dbms?