Умножьте два (2) столбца таблицы - PullRequest
0 голосов
/ 23 июня 2018

Пожалуйста, мне нужно умножить общее количество нет рабочих мест и значение MEAL_Ticket для конкретной даты

SELECT DISTINCT 
    DATENAME(dw, Time) + ', ' + CONVERT(VARCHAR(12), Time, 107) AS Date_to_Display,Vale,
    (SELECT COUNT(*) FROM CanLog AS c 
     WHERE c.Time= clog.Time AND jobtype = 'fulltime') AS Fulltime,
    (SELECT COUNT(Jobtype) * SUM(Value) FROM CanLog 
     WHERE Time BETWEEN '2018-02-12' AND '2018-02-14' AND jobtype = 'fulltime' ) AS FulltimeTicket_Value,
    (SELECT COUNT(*) FROM CanLog AS c 
     WHERE c.Time = clog.Time AND jobtype = 'contract') AS Contract,
    (SELECT COUNT(*) FROM CanLog AS c 
     WHERE c.Time = clog.Time AND jobtype = 'casual') AS Casual
FROM 
    CanLog AS clog
WHERE 
    Time BETWEEN '2018-02-12' AND '2018-02-14' 
GROUP BY 
    Time, Jobtype 
ORDER BY 
    2 ASC

Я получил эту ошибку

Столбец CanLog.Value недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY

Что мне нужно, так это вывод:

           Fulltime   FulltimeTicket_Value     Contract       Casual
2018/06/04         1       500(1*500)                  6            2
2018/06/05         3      1500(3*500)                  0            0
2018/06/06         0       0  (0*500)                  3            1
2018/06/07         2      1000(2*500)                  1            0
2018/06/08         1       500(1*500)                  1            3
2018/06/09         0         0(0*500)                  1            4

Пожалуйста, помогите

EDIT:

Пример таблицы

CREATE TABLE [dbo].[CanLog]
(
    [id] [int] IDENTITY(1,1) NOT NULL,
    [Firstname] [nvarchar](50) NOT NULL,
    [Designation] [nvarchar](50) NOT NULL,
    [Jobtype] [nvarchar](50) NOT NULL,
    [Employ_No] [nvarchar](50) NOT NULL,
    [Receipt_No] [int] NOT NULL,
    [Username] [nvarchar](50) NOT NULL,
    [Time] [datetime] NOT NULL, 
    [Value] [int] NULL
) ON [PRIMARY]

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

В дополнение ко многим пунктам, которые делает Лукаш, вам следует избегать использования between в столбцах даты / времени. Очень хорошее объяснение есть в блоге Аарона Бертрана Что общего между Между и Дьяволом .

Вы также можете упростить логику, используя переменные индикатора:

select cast(time as date) as Date_to_Display,
       sum(is_fulltime) as Fulltime,
       sum(value * is_fulltime) as FulltimeTicket_Value,
       sum(is_contract) as Contract,
       sum(is_casual) as Casual
from CanLog cl cross apply
     (values (case when cl.jobtype = 'fulltime' then 1 else 0 end),
             (case when cl.jobtype = 'contract' then 1 else 0 end),
             (case when cl.jobtype = 'casual' then 1 else 0 end)
     ) v(is_contract, iscasual)
where Time >= '2018-02-12' and time < '2018-02-15' 
group by cast(time as date) 
order by cast(time as date); 
0 голосов
/ 23 июня 2018

В начальном запросе много предупреждающих знаков:

  • GROUP BY не соответствует SELECT
  • DISTINCT + GROUP BY
  • ненужные подзапросы могут быть заменены условным агрегированием
  • позиционный заказ по
  • Я бы рекомендовал избегать имен столбцов, таких как Значение / Время
  • Datename(dw, Time) + ', ' + CONVERT(VARCHAR(12), Time, 107) Я бы заменил его на CAST(Time AS DATE)
  • Time BETWEEN '2018-02-12' AND '2018-02-14' такое сравнение может быть опасным (как упомянуто @Gordon)

Я полагаю, вы хотите что-то вроде:

SELECT 
    Date_to_Display = CAST(Time AS DATE),
    Fulltime = SUM(CASE WHEN jobtype = 'fulltime' THEN 1  ELSE 0 END),
    FulltimeTicket_Value = SUM(CASE WHEN jobtype = 'fulltime' THEN 1 ELSE 0 END) *
                               MAX(CASE WHEN jobtype = 'fulltime' THEN Value ELSE 0 END),
    Contract = SUM(CASE WHEN jobtype = 'contract' THEN 1 ELSE 0 END),
    Casual = SUM(CASE WHEN jobtype = 'casual' THEN 1 ELSE 0 END) 
FROM 
    CanLog AS clog
WHERE 
    Time >= '2018-02-12' and time < '2018-02-15' 
GROUP BY 
    CAST(Time AS DATE)
ORDER BY 
    CAST(Time AS DATE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...