SQL数组变量和If语句
我有一个历史记录表,用于保存有关法规遵从性问题的数据。我想创建一个图表,每周显示每个集群的法规遵从性状态。不幸的是,查询只显示日期不符合的状态,因此我需要创建一个查询,其中包括集群也符合的日期 我认为需要做的是创建一个不同日期值“D”的数组,然后以某种方式将数组值与行匹配,如果行存在,则显示它,如果不存在,则创建一个缺少日期和值为的行 有人能帮我吗 编辑SQLFiddle: 查询现在显示的内容:SQL数组变量和If语句,sql,sql-server,arrays,tsql,Sql,Sql Server,Arrays,Tsql,我有一个历史记录表,用于保存有关法规遵从性问题的数据。我想创建一个图表,每周显示每个集群的法规遵从性状态。不幸的是,查询只显示日期不符合的状态,因此我需要创建一个查询,其中包括集群也符合的日期 我认为需要做的是创建一个不同日期值“D”的数组,然后以某种方式将数组值与行匹配,如果行存在,则显示它,如果不存在,则创建一个缺少日期和值为的行 有人能帮我吗 编辑SQLFiddle: 查询现在显示的内容: +-------------------------------------------------
+-------------------------------------------------+
| D | Cluster | value |
+-------------------------------------------------+
| 09/05/2014 | T1 | Non-compliant |
+-------------------------------------------------+
| 09/12/2014 | T1 | Non-compliant |
+-------------------------------------------------+
| 09/17/2014 | T1 | Non-compliant |
+-------------------------------------------------+
| 09/05/2014 | T2 | Non-compliant |
+-------------------------------------------------+
| 09/12/2014 | T2 | Non-compliant |
+-------------------------------------------------+
| 09/17/2014 | T2 | Non-compliant |
+---------------------------------------------- --+
| 09/12/2014 | T3 | Non-compliant |
+-------------------------------------------------+
| 09/17/2014 | T3 | Non-compliant |
+-------------------------------------------------+
我需要它看起来像什么:
+-------------------------------------------------+
| D | Cluster | value |
+-------------------------------------------------+
| 09/05/2014 | T1 | Non-compliant |
+-------------------------------------------------+
| 09/12/2014 | T1 | Non-compliant |
+-------------------------------------------------+
| 09/17/2014 | T1 | Non-compliant |
+-------------------------------------------------+
| 09/05/2014 | T2 | Non-compliant |
+-------------------------------------------------+
| 09/12/2014 | T2 | Non-compliant |
+-------------------------------------------------+
| 09/17/2014 | T2 | Non-compliant |
+-------------------------------------------------+
| 09/05/2014 | T3 | Compliant |
+---------------------------------------------- --+
| 09/12/2014 | T3 | Non-compliant |
+-------------------------------------------------+
| 09/17/2014 | T3 | Non-compliant |
+-------------------------------------------------+
表结构示例数据:
CREATE TABLE CLUSTER_INFO_HIST
(
CLUSTER_NAME varchar(255),
HA_ENABLED varchar(255),
DATE_PULL varchar(255)
);
INSERT INTO CLUSTER_INFO_HIST
(CLUSTER_NAME, HA_ENABLED ,DATE_PULL)
VALUES
('T1', '1','09/12/2014'),
('T1', '1','09/05/2014'),
('T1', '0','08/31/2014'),
('T2', '1','09/12/2014'),
('T2', '0','09/05/2014'),
('T2', '0','08/31/2014'),
('T3', '1','09/12/2014'),
('T3', '1','09/05/2014'),
('T3', '0','08/31/2014');
CREATE TABLE CLUSTER_INFO
(
CLUSTER_NAME varchar(255),
HA_ENABLED varchar(255),
DATE_PULL varchar(255)
);
INSERT INTO CLUSTER_INFO
(CLUSTER_NAME, HA_ENABLED ,DATE_PULL)
VALUES
('T1', '1','09/17/2014'),
('T2', '0','09/17/2014'),
('T3', '1','09/17/2014');
我的问题是:
SELECT DATE_PULL, CLUSTER_NAME, HA_ENABLED FROM CLUSTER_INFO WHERE HA_ENABLED <> '1'
UNION ALL
SELECT DATE_PULL, CLUSTER_NAME, HA_ENABLED FROM CLUSTER_INFO_HIST WHERE HA_ENABLED <> '1'
ORDER BY DATE_PULL, CLUSTER_NAME
如果只想显示现有的表条目,可以编写:
Select DATE_PULL,CLUSTER_NAME,CASE when Coalesce(HA_Enabled,'0') =0 then 'Compliant' else 'NON-Compliant' end as value
from
(
Select * from CLUSTER_INFO_HIST
UNION
Select * from CLUSTER_INFO
) CI
ORDER BY DATE_PULL, CLUSTER_NAME
如果您需要提供日期范围内的信息,即使并非所有群集都报告,您也可以使用:
Declare @Start dateTime='20140101'
Declare @End dateTime=GetDate()
;With CTE as ( -- create date table
Select @Start as aDate
UNION ALL
Select 1 + aDate
from CTE
where aDate+1 <@End
)
Select aDate,ALCLUSTER.CLUSTER_NAME,Coalesce(HA_Enabled,'0') as HA_Enabled
,CASE when Coalesce(HA_Enabled,'0') =0 then 'Compliant' else 'NON-Compliant' end as value
from CTE c
JOIN --join all known CLUSTER_NAMEs
(
Select DISTINCT CLUSTER_NAME from CLUSTER_INFO_HIST
UNION
Select DISTINCT CLUSTER_NAME from CLUSTER_INFO c
) ALCLUSTER on 1=1
LEFT JOIN -- add HA_Enabled info
(
Select * from CLUSTER_INFO_HIST
UNION
Select * from CLUSTER_INFO
) CI on Convert(date,DATE_PULL,101)=c.aDate and ALCLUSTER.CLUSTER_NAME=CI.CLUSTER_NAME
OPTION (MAXRECURSION 0) -- prevent recursion break for CTE at 100
你能发布实际的查询吗?在任何人有机会提供帮助之前,你需要在这里发布一些详细信息。这里有一个SQLFiddle:很接近,但它在每个日期都这样做,而不仅仅是表中已经存在的不同日期:谢谢@bummi!这两个查询都非常有用!