2016-01-20 101 views
-1

我有一个调用Web Service的应用程序,我可能会将多达5个ID传递给此服务器并返回信息。具有多列的SQL COUNT

我在SQL表中创建一个'审计'行以保存提交的所有信息的记录。

该ID的可以按任意顺序提交,列

DLN0,DLN1,DLN2,DLN3,DLN4。

我也有DateTime和用户名列,我想尝试和做的是COUNT在任何给定日期在任何5列中输入ID的次数,因为我不希望有人提交与服务相同的ID超过两次(在任何给定的列中)。

我认为我可以通过UNION来完成,但这会让它变得非常混乱,或者这是唯一的出路吗?

CREATE TABLE [dbo].[MyL_Audit_Log](
    [ID] [INT] IDENTITY(1,1) NOT NULL, 
    [Username] [VARCHAR](30) NOT NULL, 
    [IP Address] [VARCHAR](15) NOT NULL, 
    [RequestDT] [DATETIME] NOT NULL, 
    [TranType] [VARCHAR](20) NOT NULL, 
    [NoOfDrivers] [INT] NOT NULL, 
    [DLN0] [VARCHAR](30) NOT NULL, 
    [PCode] [VARCHAR](15) NULL, 
    [DLN1] [VARCHAR](30) NULL, 
    [DLN2] [VARCHAR](30) NULL, 
    [DLN3] [VARCHAR](30) NULL, 
    [DLN4] [VARCHAR](30) NULL, 
    [RequestString] [VARCHAR](MAX) NOT NULL, 
    [Result] [VARCHAR](30) NOT NULL, 
    [HttpStatusCode] [VARCHAR](10) NOT NULL, 
    [ResponseTime] [INT] NOT NULL, 
    [ReturnedData] [VARCHAR](MAX) NOT NULL, 
PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

样品ID的

XYZ43562MC4 ABC23214MC2 LKU23411PO3

干杯:

我已经取得了一些成功

SELECT COUNT(MyTbl.DLN0) AS [Count], MyTbl.DLN0 AS [DLN], MyTbl.Username, CONVERT(VARCHAR(12),MyTbl.RequestDT,103) AS [DateTime] FROM 
(
SELECT DLN0, [RequestDT], Username FROM dbo.MyL_Audit_Log 
UNION 
SELECT DLN1, [RequestDT], Username FROM dbo.MyL_Audit_Log 
UNION 
SELECT DLN2, [RequestDT], Username FROM dbo.MyL_Audit_Log 
UNION 
SELECT DLN3, [RequestDT], Username FROM dbo.MyL_Audit_Log 
UNION 
SELECT DLN4, [RequestDT], Username FROM dbo.MyL_Audit_Log 
) AS MyTbl 
WHERE MyTbl.DLN0 <> '' 
GROUP BY MyTbl.DLN0, MyTbl.Username, CONVERT(VARCHAR(12),MyTbl.RequestDT,103) 

我的表做到了这一点。

+0

请您可以加入该结构的SQL定义和你试图查询? –

+0

请问你可以发一些你会通过的样本ID – TheGameiswar

+0

为什么你需要在这里工会?这个查询是否存在问题SELECT COUNT(MyTbl.DLN0)AS [Count],MyTbl.DLN0 AS [DLN],MyTbl.Username,CONVERT(VARCHAR(12),MyTbl.RequestDT,103)AS [DateTime] FROM dbo.MyL_Audit_Log as MyTbl WHERE MyTbl.DLN0 <>'' GROUP BY MyTbl.DLN0,MyTbl.Username,CONVERT(VARCHAR(12),MyTbl.RequestDT,103) –

回答

1

您所查询的是好的,但你可能想使用全部,而不是工会联合会(UNION语句不设定结果的SELECT DISTINCT):

SELECT COUNT(MyTbl.DLN0) AS [Count], MyTbl.DLN0 AS [DLN], MyTbl.Username, CONVERT(VARCHAR(12),MyTbl.RequestDT,103) AS [DateTime] FROM 
(
SELECT DLN0, [RequestDT], Username FROM dbo.MyL_Audit_Log 
UNION ALL 
SELECT DLN1, [RequestDT], Username FROM dbo.MyL_Audit_Log 
UNION ALL 
SELECT DLN2, [RequestDT], Username FROM dbo.MyL_Audit_Log 
UNION ALL 
SELECT DLN3, [RequestDT], Username FROM dbo.MyL_Audit_Log 
UNION ALL 
SELECT DLN4, [RequestDT], Username FROM dbo.MyL_Audit_Log 
) AS MyTbl 
WHERE MyTbl.DLN0 <> '' 
GROUP BY MyTbl.DLN0, MyTbl.Username, CONVERT(VARCHAR(12),MyTbl.RequestDT,103) 
+0

为什么他需要工会在这里?是否有问题,如果直接采取计数? –

+0

我的理解是他想要DLN0 + DLN1 + DLN2 + DLN3 + DLN4的计数,Union All对此很快就是一个很好的解决方案。 –

+0

@haytem这是正确的 – Lynchie