需要此查询的SQL Server存储过程

时间:2010-05-22 06:30:58

标签: sql-server stored-procedures datagrid asp.net

我有一个ASPX.NET DataGrid,我试图从一个名为location的字段的表中使用一个选择LIKE'X'%。我试图在我的数据网格中的不同列中显示以某个字母开头的位置(例如wxxx,axxx,fxxx)。

我正在尝试使用下面显示的SP在我的数据网格中显示多个列。问题是表locationMaster只有一个名为location的字段。字段位置具有以不同字母开头的可变位置编号(示例w1002,w1003,00159,00526)。我想要做的是使用sp在我的数据网格中的一列中显示wxxxx位置,在另一列中显示0xxxx。如果我只是简单地运行

SELECT DISTINCT 
    LM.LOCATION AS 'LOCATIONS', 
    LM.COUNTLEVEL AS 'COUNTLEVEL' 
FROM  
    SOH S WITH(NOLOCK)  
JOIN LOCATIONMASTER LM ON LM.LMID = S.LMID 
WHERE 
    LM.COUNTLEVEL = 1 
    AND LM.LOCATION NOT IN ('RECOU','PROBLEM','TOSTOCK','PYXVLOC')

我的Datagrid只有一列包含所有位置,页面将非常冗长 如果我能以某种方式使用LIKE'W%'并且在sp中使用'0%'并创建两列

SELECT
  DISTINCT LM.LOCATION AS '0 LOCATIONS' ,
    LM.COUNTLEVEL AS 'COUNTLEVEL'
FROM  SOH S WITH(NOLOCK)
  JOIN LOCATIONMASTER LM ON LM.LMID = S.LMID
WHERE
   LM.COUNTLEVEL = 1 AND
   LM.LOCATION NOT IN ('RECOU','PROBLEM','TOSTOCK','PYXVLOC')
   AND LM.LOCATION LIKE '0%'

SELECT
   DISTINCT LM.LOCATION AS 'A LOCATIONS' ,
   LM.COUNTLEVEL AS 'COUNTLEVEL'
FROM  SOH S WITH(NOLOCK)
  JOIN LOCATIONMASTER LM ON LM.LMID = S.LMID
WHERE
   LM.COUNTLEVEL = 1 AND
   LM.LOCATION NOT IN ('RECOU','PROBLEM','TOSTOCK','PYXVLOC')
   AND LM.LOCATION LIKE 'A%'**

这是我的数据网格代码

<Columns>
    <asp:BoundColumn DataField="COUNTLEVEL" Visible="false"/>
    <asp:TemplateColumn HeaderText="LOCATION">
       <ItemTemplate>
          <a href='confirmRecount.aspx?Var=<%# DataBinder.Eval(Container.DataItem ,"0 LOCATIONS")%>'>
          <%# DataBinder.Eval(Container.DataItem, "0 LOCATIONS")%>
          </a>
       </ItemTemplate>
    </asp:TemplateColumn>
</Columns>

1 个答案:

答案 0 :(得分:0)

您想要做的事情不是真正的逻辑,连续的数据与该行中的其他数据相关,无法通过简单的SQL选择来完成。假设你有一个包含2行的小桌子:

**LOCATION**         **COUNTLEVEL**
   W1234                  10
   A7654                  23

现在您要对其进行转换,以便W1234和A7654位于2个不同的列中。计数级别字段会发生什么。那么你将有1行与theee列,你将有2个计数级别不再与他们各自的行相关,他们现在将与不同的列相关,计数级别列中会有什么?所以你必须尝试做这样的事情:

**LOCATION A**  **COUNTLEVELA**   **LOCATION W**   **COUNTLEVELW**
    NULL             NULL              W1234             10   
   A7654             23                 NULL            NULL 

但我认为这不会有任何用处。

你可以将垂直行投影到水平列的唯一方法是PIVOT但是你最终得到的是一个字段的值变成列标题而另一个字段的值变成你的行所以你会得到一些东西如下所示:

                  **W1234**            **A7654**
LOCATION COUNT      10                    23

但是在你的情况下,这只会让你的网格视图有一行和多列,这对你来说非常有用,你需要第三个变量来垂直分组,比如deptartment。

如果您只想在页面上占用数据网格所需的垂直空间量,则可以使用2个数据网格,让SP返回2个数据集,然后是2个数据中匹配行的数据网格不会以任何方式相互关联。