Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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仅在非空时翻转和获取行_Sql_Sql Server_Tsql - Fatal编程技术网

SQL仅在非空时翻转和获取行

SQL仅在非空时翻转和获取行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我一直在努力解决一个大问题,只是不知道如何才能做到。。。因此,感谢您的SQL专家提供的任何帮助 我现在有一张这样的桌子: Sticker Price Cash Price Credit Price Value Yes Yes NULL 107 NULL Yes NULL 115 Yes Yes

我一直在努力解决一个大问题,只是不知道如何才能做到。。。因此,感谢您的SQL专家提供的任何帮助

我现在有一张这样的桌子:

Sticker Price   Cash Price      Credit Price    Value
Yes             Yes             NULL            107
NULL            Yes             NULL            115
Yes             Yes             NULL            127
我需要做的是构造一个表(翻转)来显示:

Text            Value   IsDefault
Sticker Price   Sticker 1
Cash Price      Cash    0
并且不显示信用价格,因为第一个表中的所有值都为空

基本上我只想在不全是空的情况下展示标签,如果不全是空的情况下展示现金,等等

我想到了pivot,但我的头就是绕不过去

目前,我有以下内容可供参考:

SELECT SH1.[Sticker Price], SH1.[Credit Price], SH1.[Cash Price], SH1.[Credit Price], UG.Description as Value,
    CASE ROW_NUMBER() OVER(ORDER BY UG.Description)
    WHEN 1 THEN 1 ELSE 0 END as ISDEFAULT
FROM [uStore].[dbo].[ACL_UserGroup] UG
    INNER JOIN [uStore].[dbo].[ACL_UserGroupMembership] UGM ON UG.UserGroupId = UGM.UserGroupId
    INNER JOIN [XMPDBHDS].[XMPieHDSSchema60].[Sheet1] SH1 ON CONVERT(nvarchar(100), SH1.[Centre Code]) = UG.Description
WHERE UGM.UserId = 1012

我只是不知道如何用我有限的SQL知识从这里得到我想要的表…

在这种情况下,您应该执行
左连接

SELECT SH1.[Sticker Price], SH1.[Credit Price], 
SH1.[Cash Price], 
SH1.[Credit Price], 
UG.Description as Value, 
CASE ROW_NUMBER() OVER(ORDER BY UG.Description) WHEN 1 THEN 1 ELSE 0 
END as ISDEFAULT

FROM [uStore].[dbo].[ACL_UserGroup] UG

LEFT JOIN [uStore].[dbo].[ACL_UserGroupMembership] UGM 
ON UG.UserGroupId = UGM.UserGroupId

LEFT JOIN [XMPDBHDS].[XMPieHDSSchema60].[Sheet1] SH1 
ON CONVERT(nvarchar(100), SH1.[Centre Code]) = UG.Description

WHERE UGM.UserId = 1012
AND SH1.[Credit Price] IS NOT NULL
AND UGM.UserGroupId IS NOT NULL;

最后我幸运地使用了pivot:

SELECT DISTINCT [Text], SUBSTRING([Text], 1, CHARINDEX(' ', [Text])) as Value, 
CASE ROW_NUMBER() OVER(ORDER BY [Text])
    WHEN 1 THEN 1 ELSE 0 END as ISDEFAULT
FROM
( SELECT SH1.[Sticker Price], SH1.[Credit Price], SH1.[Cash Price], UG.Description
FROM [uStore].[dbo].[ACL_UserGroup] UG
    INNER JOIN [uStore].[dbo].[ACL_UserGroupMembership] UGM ON UG.UserGroupId = UGM.UserGroupId
    INNER JOIN [XMPDBHDS].[XMPieHDSSchema60].[Sheet1] SH1 ON CONVERT(nvarchar(100), SH1.[Centre Code]) = UG.Description
WHERE UGM.UserId = @UserID) U
       UNPIVOT
   (Details FOR [Text] IN ([Sticker Price], [Credit Price], [Cash Price] )
)AS unpvt group by [Text]

结果

请格式化SQL代码,将其缩进四个空格。或者选择代码并按ctrl-k
。如果我们知道您使用的是什么RDBMS(SQL Server、Oracle、Postgres、MySQL),可能会有所帮助。此外,很难看出您的第二个表与第一个表之间的关系。谢谢您,先生,我现在已经缩进了代码。我使用的是MSSQL 2008。基本上,第二个表需要在文本列中显示第一个表中的列的名称,但前提是该列不包含第一个表中的所有空值(如果有意义的话)。。。e、 g.A B C | Yes Null Yes | Null Null Yes我需要将上述内容转换为:文本值| A“某些文本”| C“某些其他文本”跳过B,因为它在第一个表中不包含任何值。。。这些值只是我输入的字符串,用于表示要在另一个表中使用的A、B和C。谢谢您好,Rahul,谢谢您的建议,但这仍然给了我一个表格的格式:贴纸价格-信用价格-现金价格-信用价格-价值-IsDefault没有价值。。。我想“flip”这个表,如果原始表中的所有行都不是空的,那么只显示price类型,如果这有意义的话