Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL数组变量和If语句_Sql_Sql Server_Arrays_Tsql - Fatal编程技术网

SQL数组变量和If语句

SQL数组变量和If语句,sql,sql-server,arrays,tsql,Sql,Sql Server,Arrays,Tsql,我有一个历史记录表,用于保存有关法规遵从性问题的数据。我想创建一个图表,每周显示每个集群的法规遵从性状态。不幸的是,查询只显示日期不符合的状态,因此我需要创建一个查询,其中包括集群也符合的日期 我认为需要做的是创建一个不同日期值“D”的数组,然后以某种方式将数组值与行匹配,如果行存在,则显示它,如果不存在,则创建一个缺少日期和值为的行 有人能帮我吗 编辑SQLFiddle: 查询现在显示的内容: +-------------------------------------------------

我有一个历史记录表,用于保存有关法规遵从性问题的数据。我想创建一个图表,每周显示每个集群的法规遵从性状态。不幸的是,查询只显示日期不符合的状态,因此我需要创建一个查询,其中包括集群也符合的日期

我认为需要做的是创建一个不同日期值“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!这两个查询都非常有用!