我本质上希望表格宽度是动态的。
一组单独的表列看起来像这样。
Rank Method Number BasedOn
---------------------------------
1 E 1 Null
2 W 2 Null
3 P 3 math
用于选择列包含内容的SQL CASE
很简单
CASE
WHEN Method = 'P' THEN BasedOn
WHEN Method = 'E' THEN 'E'
END AS BasedOn
我想要的是,如果我过滤“等级”以使“方法”列中的任何行中都没有“ P”,那么就不会选择“基于”列。
因此伪代码看起来像这样
SELECT
Rank,
Method,
Number,
CASE
WHEN Method CONTAINS 'P' THEN END AS BasedOn
ELSE
END
FROM
Table1
WHERE
Rank IN (1, 2)
返回
Rank Method Number
----------------------
1 E 1
2 W 2
但如果
SELECT
Rank,
Method,
Number,
CASE
WHEN Method CONTAINS 'P' THEN
END AS BasedOn
ELSE END
FROM
Table1
WHERE
Rank IN (2, 3)
然后它应该返回
Rank Method Number BasedOn
---------------------------------
2 W 2 Null
3 P 3 Math
这可能吗?我应该如何汇总支票中的“方法”列?
答案 0 :(得分:1)
您需要运行两次查询,并使用if()
。我的t-sql有点生锈,但这应该可以让您很好地开始。
if exists (select * from table1 where method = 'P')
begin
SELECT Rank, Method, Number, CASE WHEN Method = 'P' THEN METHOD END AS BasedOn END
FROM Table1
end
else
begin
SELECT Rank, Method, Number
FROM Table1
end
答案 1 :(得分:0)
我是一个怪物,但要感谢Tanveer Badar,他把我介绍给我的if exists
逻辑推论给了我。
我将包含一个“集合”,但是在我的最终代码中,我将中间块复制了11次。
我们从开始声明开始。我出于个人原因使用LIKE
,但您的目的可能会有所不同。
DECLARE @SQL VARCHAR(MAX) = ''
DECLARE @UnionCode VARCHAR(10) = 'LXXX P'
SET @UnionCode = CONCAT('%',@UnionCode,'%')
DECLARE @CompanyCodeInput VARCHAR(2) = '31'
从那里开始,我们以字符串的形式移至SQL语句的开头。
--The beginning of the SQL statement.
SET @SQL = @SQL+'SELECT
[UnionGroupCode]
,[UnionName]
'
现在我们开始N个块中的第一个。
--Employee Union Dues 1
IF exists (SELECT [Dues1RatePercentage] FROM Table_1
WHERE [CompanyCode] = @CompanyCodeInput AND [UnionGroupCode] LIKE @UnionCode AND [Dues1RatePercentage] <> 0)
BEGIN
IF exists (
SELECT [Dues1Method] FROM Table_1
WHERE [CompanyCode] = @CompanyCodeInput AND [UnionGroupCode] LIKE @UnionCode AND [Dues1Method] = 'P')
BEGIN
SET @SQL = @SQL+',[Dues1RatePercentage] AS [Other 1]
,[Dues1Method] AS [Other 1 Method]
,[Dues1BasedOn] AS [Other 1 Based On]
'
END
ELSE
BEGIN
SET @SQL = @SQL+',[Dues1RatePercentage] AS [Other 1]
,[Dues1Method] AS [Other 1 Method]
'
END
END
然后我们用最后一个代码块将其关闭
--The end of the SQL statement
SET @SQL = @SQL+'FROM Table_1
WHERE [CompanyCode] = '''+@CompanyCodeInput+''' AND [UnionGroupCode] LIKE '''+@UnionCode+'''
ORDER BY [UnionGroupCode]'
PRINT(@SQL)
EXEC(@SQL)
每个中心代码块都检查两件事。
'Should we even include the full set of columns?'
'If we should, should we include the BasedOn column?'
面对这些问题,我们必须在@SQL
之外增加创造力。我知道所有列都应该命名,这样我就可以命名它们。但是,从理论上讲,也应该可以通过引入描述的附加查询来动态命名列,在DECLARE
的第一个块中添加另一个@DynamicColumnName
,并在{的前半部分中添加{1}}。 if exists
然后将SET @DynamicColumnName = [Description]
更改为AS [Other 1]
适当修改
由于这两个问题,我们最多查询服务器(N * 2)+1次,其中N是代码中心块的数量。
我想强调一点,尽管这对于我的小型数据库来说是完全可以的,但是这是非常糟糕的性能。我的目的是每月进行一次此操作,但也要使其在我当前的工作后仍然可以生存。