具有计数和日期的SQL联合
再次询问,但希望更清楚。我有以下情况,这是完美的工作,你可以看到原来的问题,这是答案具有计数和日期的SQL联合,sql,sql-server,Sql,Sql Server,再次询问,但希望更清楚。我有以下情况,这是完美的工作,你可以看到原来的问题,这是答案 DECLARE @imvw_woap_code_with_cust TABLE ( pkey INT, Code_id VARCHAR(200), code_type_id VARCHAR(200), asset_standard_id VARCHAR(200), date_completed DATETIME ) INSE
DECLARE @imvw_woap_code_with_cust TABLE (
pkey INT,
Code_id VARCHAR(200),
code_type_id VARCHAR(200),
asset_standard_id VARCHAR(200),
date_completed DATETIME
)
INSERT INTO @imvw_woap_code_with_cust(pkey,Code_id,code_type_id,asset_standard_id,date_completed)
SELECT 101480,'Alarmining','A-Problem','1 East','2017-08-10 02:00:30.013'
UNION SELECT 103350,'Fluid/Gas Leak (Out)','A-Problem','2 west','2017-08-10 02:00:30.013'
UNION SELECT 104033,'plug/Pwr Cord Damg','A-Problem','2 west','2017-08-10 02:00:30.013'
UNION SELECT 107296,'Alarmining','A-Problem','2 west','2017-09-11 02:00:30.013'
UNION SELECT 106404,'Incoming Inspect','A-Problem','2 west','2017-08-10 02:00:30.013'
UNION SELECT 106407,'Incoming Inspect','A-Problem','2 west','2017-09-11 02:00:30.013'
UNION SELECT 106408,'Incoming Inspect','A-Problem','2 west','2017-09-12 02:00:30.013'
DECLARE @IMTBL_CODE TABLE (
pkey INT,
Code_id VARCHAR(200),
code_type_id VARCHAR(200)
)
INSERT INTO @IMTBL_CODE(pkey,Code_id,code_type_id)
SELECT 100064,'1-NO PROBLEM CODE ENTERED','A-Problem'
UNION SELECT 100068,'Alarmining','A-Problem'
UNION SELECT 100069,'Battery Failure','A-Problem'
UNION SELECT 100070,'Incoming Inspect','A-Problem'
UNION SELECT 100071,'Fluid/Gas Leak (Out)','A-Problem'
UNION SELECT 100072,'Case Damaged','A-Problem'
UNION SELECT 100073,'plug/Pwr Cord Damg','A-Problem'
CREATE VIEW cause_codes as
SELECT
possibilities.code_id AS code_id,
possibilities.asset_standard_id,
Count(U.pkey) AS [COUNT]
FROM (
SELECT
a.asset_standard_id,b.code_id
FROM (SELECT DISTINCT asset_standard_id FROM @imvw_woap_code_with_cust) AS a
CROSS JOIN (
SELECT DISTINCT code_id FROM @imtbl_code
UNION
SELECT DISTINCT CODE_ID AS [ID] FROM @imvw_woap_code_with_cust
) AS b
) AS possibilities
LEFT OUTER JOIN @imvw_woap_code_with_cust AS U ON U.code_id = possibilities.code_id
AND possibilities.asset_standard_id=u.asset_standard_id
and u.code_type_id='A-Problem'
GROUP BY possibilities.code_id, possibilities.asset_standard_id
order by [count]
一旦我将其创建到视图(cause_code)中,它将返回一个整洁的表,其中包含代码出现的次数计数(也包括0计数)
然后客户回来了,希望添加日期
所以如果我在视图中添加日期
ALTER VIEW cause_codes as
SELECT
possibilities.code_id AS code_id,
possibilities.asset_standard_id,
Count(U.pkey) AS [COUNT],
U.date_created
FROM (
SELECT
a.asset_standard_id,b.code_id
FROM (SELECT DISTINCT asset_standard_id FROM @imvw_woap_code_with_cust) AS a
CROSS JOIN (
SELECT DISTINCT code_id FROM @imtbl_code
UNION
SELECT DISTINCT CODE_ID AS [ID] FROM @imvw_woap_code_with_cust
) AS b
) AS possibilities
LEFT OUTER JOIN @imvw_woap_code_with_cust AS U ON U.code_id = possibilities.code_id
AND possibilities.asset_standard_id=u.asset_standard_id
and u.code_type_id='A-Problem'
GROUP BY possibilities.code_id, possibilities.asset_standard_id,date_created
order by [count]
然后进行搜索
select * from cause_codes where asset_standard_id = '2 west' and date_completed > '2017-09-10 02:00:30.013' and date_completed < '2017-09-12 02:00:30.013'
有没有一种方法可以做到这一点(添加一个搜索日期),但仍然保持单行的正确计数
我希望这是清楚的。。。这是一个相当大的问题。
感谢您花时间阅读我的书:)每当您按日期分组,并且该日期有多个唯一值时,您将获得每个日期的多行,每个唯一日期的分组总和。请注意,您现在要求提供每个代码、资产id和日期的汇总汇总数据 您必须获取新日期值的最小值或最大值(另一个摘要),而不是按日期分组,或者如果您想要并且您确定不会获得一个大的日期列表,您可以将它们列在一个逗号分隔的列表中,以供行的可能日期使用,如果您想这样做的话。下面是一个使用For Xml技巧将日期列表与其他表区分开来的示例。在网上还有其他的例子
select
RepName, DateList
from
(
select
FirstName + ' ' + LastName as RepName, PersonID
from
Person
where
PersonID in (23164,30637,29985,25643)
) as p
cross apply (
select stuff ( (
select
', ' + convert(varchar(16), CallDate, 101)
from
(
select
distinct TheDate
from
dbo.Info as c
inner join Person as p2 on p2.PersonID = c.PersonID
where
p2.PersonID = p.PersonID
) as dat
order by CallDate
for xml path('')
), 1, 2, '') as DateList
) as dateList
我是按自己的方式先到的,我没有衡量业绩
;WITH Activity As
(
SELECT Count = COUNT(*),Customer.Code_id,Customer.asset_standard_id
FROM @imvw_woap_code_with_cust Customer
GROUP BY Customer.Code_id,asset_standard_id
),
Groups AS
(
SELECT Code_id,asset_standard_id
FROM @IMTBL_CODE Codes
CROSS APPLY (SELECT DISTINCT asset_standard_id FROM @imvw_woap_code_with_cust) X
),
GroupedActivity AS
(
SELECT Groups.Code_id,Groups.asset_standard_id,Count = CASE WHEN Activity.Count IS NULL THEN 0 ELSE Activity.Count END
FROM Groups
LEFT OUTER JOIN Activity ON Activity.Code_id = Groups.Code_id AND Activity.asset_standard_id = Groups.asset_standard_id
)
SELECT
C.pkey,
G.Code_id,
G.asset_standard_id,
G.Count,
C.date_completed
FROM
@imvw_woap_code_with_cust C
INNER JOIN GroupedActivity G ON G.Code_id = C.Code_id AND G.asset_standard_id = C.asset_standard_id
WHERE
G.asset_standard_id = '2 west' and date_completed > '2017-09-10 02:00:30.013' and date_completed < '2017-09-12 02:00:30.013'
从结果中选择最小或最大日期可以吗?如果是这样的话,您可以将创建的日期添加到分组中以规范化计数,或者您希望在任意窗口内返回组内所有日期的总数吗?它需要在任意窗口内返回。。糟糕透了!LOLI认为您的数据应该是-->Incoming Inspect(3)| Alarmining(1),用于您上面提供的筛选器。您从上面的问题中从哪里获得PersonID?我没有,我使用了一个来自我访问过的数据的示例,然后尝试对原始架构进行注释。我想我对自己的语法没有信心,不先测试就从内存中执行。
select
RepName, DateList
from
(
select
FirstName + ' ' + LastName as RepName, PersonID
from
Person
where
PersonID in (23164,30637,29985,25643)
) as p
cross apply (
select stuff ( (
select
', ' + convert(varchar(16), CallDate, 101)
from
(
select
distinct TheDate
from
dbo.Info as c
inner join Person as p2 on p2.PersonID = c.PersonID
where
p2.PersonID = p.PersonID
) as dat
order by CallDate
for xml path('')
), 1, 2, '') as DateList
) as dateList
;WITH Activity As
(
SELECT Count = COUNT(*),Customer.Code_id,Customer.asset_standard_id
FROM @imvw_woap_code_with_cust Customer
GROUP BY Customer.Code_id,asset_standard_id
),
Groups AS
(
SELECT Code_id,asset_standard_id
FROM @IMTBL_CODE Codes
CROSS APPLY (SELECT DISTINCT asset_standard_id FROM @imvw_woap_code_with_cust) X
),
GroupedActivity AS
(
SELECT Groups.Code_id,Groups.asset_standard_id,Count = CASE WHEN Activity.Count IS NULL THEN 0 ELSE Activity.Count END
FROM Groups
LEFT OUTER JOIN Activity ON Activity.Code_id = Groups.Code_id AND Activity.asset_standard_id = Groups.asset_standard_id
)
SELECT
C.pkey,
G.Code_id,
G.asset_standard_id,
G.Count,
C.date_completed
FROM
@imvw_woap_code_with_cust C
INNER JOIN GroupedActivity G ON G.Code_id = C.Code_id AND G.asset_standard_id = C.asset_standard_id
WHERE
G.asset_standard_id = '2 west' and date_completed > '2017-09-10 02:00:30.013' and date_completed < '2017-09-12 02:00:30.013'
;WITH Activity As
(
SELECT Count = COUNT(*),Customer.Code_id,Customer.asset_standard_id
FROM @imvw_woap_code_with_cust Customer
GROUP BY Customer.Code_id,asset_standard_id
)
SELECT
C.pkey,
G.Code_id,
G.asset_standard_id,
G.Count,
C.date_completed
FROM
@imvw_woap_code_with_cust C
INNER JOIN Activity G ON G.Code_id = C.Code_id AND G.asset_standard_id = C.asset_standard_id
WHERE
G.asset_standard_id = '2 west' and date_completed > '2017-09-10 02:00:30.013' and date_completed < '2017-09-12 02:00:30.013'
;WITH GroupedData AS
(
SELECT
possibilities.code_id AS code_id,
possibilities.asset_standard_id,
Count(U.pkey) AS [COUNT]
FROM (
SELECT
a.asset_standard_id,b.code_id
FROM (SELECT DISTINCT asset_standard_id FROM @imvw_woap_code_with_cust) AS a
CROSS JOIN (
SELECT DISTINCT code_id FROM @imtbl_code
UNION
SELECT DISTINCT CODE_ID AS [ID] FROM @imvw_woap_code_with_cust
) AS b
) AS possibilities
LEFT OUTER JOIN @imvw_woap_code_with_cust AS U ON U.code_id = possibilities.code_id
AND possibilities.asset_standard_id=u.asset_standard_id
and u.code_type_id='A-Problem'
GROUP BY possibilities.code_id, possibilities.asset_standard_id
)
SELECT
G.code_id,
G.asset_standard_id,
G.COUNT
C.date_completed
FROM
@imvw_woap_code_with_cust C
INNER JOIN GroupedData G ON G.Code_id = C.Code_id AND G.asset_standard_id = C.asset_standard_id
ORDER BY count