我使用以下查询来收集有关每个ProductId
的一些信息 - 请注意,ProductId
可以在dbo.Sales
表中包含多条记录:
SELECT
c.ProductId,
COUNT(*) as NumberOfRecords,
(SELECT
(ISNULL(NULLIF(c.Text, ''), 'FALSE'))) as TextFieldHasData
FROM dbo.Sales c
JOIN dbo.Sources s
ON c.ProductId = s.ProductId
AND s.SourceStatusId in (1,2)
GROUP BY c.ProductId, c.Status, s.SourceStatusId, c.Text
ORDER BY c.ProductId
我需要调整查询的ISNULL
部分,并且语法有问题;我实际上需要做的是首先检查NumberofRecords
计数 - 如果给定结果记录的NumberofRecords
计数大于1,则该记录的TextFieldHadData
字段应该只说"N/A"。 但是,如果给定结果记录的NumberofRecords
计数 = 1,则它应该检查c.Text
字段是 NULL 还是空白。 如果为 NULL 或 Blank,则TextFieldHasData
字段将显示"FALSE"。如果它不是 NULL 或空白,则 TextFieldHasData 字段将显示"TRUE"。
查看您的代码,也许您正在寻找类似以下内容的内容(您将分组到 ProductId 级别(:
SELECT
c.ProductId
, COUNT(*) as NumberOfRecords
,
CASE
WHEN COUNT(*) > 1
THEN 'N/A'
ELSE
CASE
WHEN SUM(CASE WHEN ISNULL(c.Text, '') = '' THEN 0 ELSE 1 END) > 0
THEN 'TRUE'
ELSE 'FALSE'
END
END TextFieldHasData
FROM
dbo.Sales c
JOIN dbo.Sources s ON
c.ProductId = s.ProductId
AND s.SourceStatusId in (1, 2)
GROUP BY c.ProductId
ORDER BY c.ProductId
您可以使用以下查询:
我无法验证它,因为我没有这些表,但它应该可以工作,除非您发现轻微的语法错误。
这个想法是使用">当..."SQL函数
select v.productid,v.NumberOfRecords,
case
when v.NumberOfRecords>1 then 'N/A'
when v.NumberOfRecords=1 and isnull(v.TextFieldHasData,'') ='' then 'FALSE'
else 'TRUE' end [textfieldhasdata]
from(
SELECT
c.ProductId,
COUNT(*) as NumberOfRecords,
(SELECT
(ISNULL(NULLIF(c.Text, ''), 'FALSE'))) as TextFieldHasData
FROM dbo.Sales c
JOIN dbo.Sources s
ON c.ProductId = s.ProductId
AND s.SourceStatusId in (1,2)
GROUP BY c.ProductId, c.Status, s.SourceStatusId, c.Text) v
ORDER BY ProductId